华为机试算法练习-Java

因为一些原因又改成Java了,这两天做了点题目熟悉一下Java的输入输出。

HJ103

题目描述

Redraiment是走梅花桩的高手。Redraiment总是起点不限,从前到后,往高的桩子走,但走的步数最多,不知道为什么?你能替Redraiment研究他最多走的步数吗?
样例输入
6
2 5 1 5 4 5
样例输出
3
提示
Example:
6个点的高度各为 2 5 1 5 4 5
如从第1格开始走,最多为3步, 2 4 5
从第2格开始走,最多只有1步,5
而从第3格开始走最多有3步,1 4 5
从第5格开始走最多有2步,4 5
输入
6
2
5
1
5
4
5
输出
3
所以这个结果是3。

import java.util.*;
public class Main{
public static int findmax(int []arr,int n){
int [] max=new int[n];
for(int i=0;i<n;i++){
max[i]=1;
for(int j=0;j<i;j++){
if(arr[j]<arr[i]){
    max[i]=Math.max(max[i],max[j]+1);
}
}
}

int mmax=0;
for(int i=0;i<n;i++){
    if(max[i]>mmax){
        mmax=max[i];
    }

}
return mmax;
}
public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    while(in.hasNextInt()){
        int n=in.nextInt();
        int []a=new int[n];
        for(int i=0;i<n;i++){
            a[i]=in.nextInt();
        }
        System.out.println(findmax(a,n));
    }
}
}

对应最长上升子序列(虽然并不知道这个是什么)。
建立一个数组max,和输入的数组对应,存储相应的最大长度,最后遍历这个数组找到最大输出即可。
max[0]肯定为1,对于后续的每一个数,有可能使其最大长度进行更新的数必然是比它小的数,因为对于比它大的数是无法到达这个数的,比如说5在4前面,但是根据题目,5是不可能走到4的。所以只需要考虑比当前这个数小的数。
从头开始遍历知道这个数之前的数,初始值为1,遇到一个比它小的数,考虑它原本的长度max[i]和比它小的数的最大长度到它的长度max[j]+1。
不断往后更新,每个位置都能得到它的最大长度。
最后遍历找到最大值。

HJ102

如果统计的个数相同,则按照ASCII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。

实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。
输入描述:
输入一串字符。
输出描述:
对字符中的
各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
示例1
输入
aadddccddc
输出
dca

import java.io.*;
import java.util.*;
public class Main{
public static void main(String []args)throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader( System.in));
String str;

while((str=br.readLine())!=null){
    int []key=new int[150];
char []chs=str.toCharArray();

int len=chs.length;

for(int i=0;i<len;i++){
key[chs[i]]++;
}
int max=0;
for(int i=0;i<key.length;i++){
if(key[i]>max){
max=key[i];
}
}
StringBuilder sbf = new StringBuilder();
while(max!=0){
for(int j=0;j<key.length;j++){
if(key[j] == max){
sbf.append((char)j);
}
}
max--;
}
System.out.println(sbf.toString());
}
}
}

ASII码是最大128,所以定义一个比128大的数组,用来存每一个符号的数量。
循环计数。
找到最大值,最大值依次递减找符合的字符并输出。
在讨论里面看到了一个c++写的思路,把每一个字符存到map里面,然后就可以利用map来排序并输出,key是字符,value是字符个数。由于不知道用java怎么写,暂时保留思路,后续再看。

HJ101

输入整型数组和排序标识,对其元素按照升序或降序进行排序(一组测试用例可能会有多组数据)
接口说明
原型:
void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag);
输入参数:
Integer[] pIntegerArray:整型数组
int iSortFlag:排序标识:0表示按升序,1表示按降序
输出参数:

返回值:
void
本题有多组输入,请使用while(cin>>)处理
输入描述:
1、输入需要输入的整型数个数
输出描述:
输出排好序的数字
示例1
输入
8
1 2 4 9 3 55 64 25
0
输出
1 2 3 4 9 25 55 64

import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String input;
while((input=br.readLine())!=null){
int n=Integer.parseInt(input);
String []arr=br.readLine().split(" ");
int flag=Integer.parseInt(br.readLine());
int []array=new int[arr.length];
for(int i=0;i<arr.length;i++){
array[i]=Integer.parseInt(arr[i]);
}
Arrays.sort(array,0,array.length);
StringBuilder sbu=new StringBuilder();
if(flag==1){
    int temp;
for(int i=0;i<array.length/2;i++){
    temp=array[i];
    array[i]=array[array.length-1-i];
    array[array.length-1-i]=temp;
}
}
for(int i=0;i<array.length;i++){
    sbu.append(array[i]).append(" ");
}
System.out.print(sbu.substring(0,sbu.length()-1));
}
    br.close();
}
}

多组输入用while((input=br.readLine())!=null){},所以要写throws IOException,注意单词拼写。
注意这里input已经取到了第一个输入,所以可以直接转换成想要的数据格式。
数组排序用Arrays.sort(int []arr,int start,int end),左开右闭区间,可以缺省。
输出的时候不要最后一个空格,所以是sbu.length()-1。

HJ100

功能:等差数列 2,5,8,11,14。。。。
输入:正整数N >0
输出:求等差数列前N项和
返回:转换成功返回 0 ,非法输入与异常返回-1
本题为多组输入,请使用while(cin>>)等形式读取数据
输入描述:
输入一个正整数。
输出描述:
输出一个相加后的整数。
示例1
输入
2
输出
7

import java.io.*;
public class Main{
    public static void main(String [] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String input;
        while((input=br.readLine())!=null){
            int n=Integer.parseInt(input);
            int sum=(3*n+1)*n/2;
            System.out.println(sum);
        }
    }
}

等差数列公式:
S n = ( x 1 + x n ) n 2 = ( x 1 + x 1 + ( n − 1 ) d ) n 2 = n x 1 + ( n − 1 ) n 2 d S_n=\cfrac{(x_1+x_n)n}{2}=\cfrac{(x_1+x_1+(n-1)d)n}{2}=nx_1+\cfrac{(n-1)n}{2}d Sn=2(x1+xn)n=2(x1+x1+(n1)d)n=nx1+2(n1)nd
顺手补充一下等比数列前n项和:
S n = x 1 ( 1 − q n ) 1 − q S_n=\cfrac{x_1(1-q^n)}{1-q} Sn=1qx1(1qn)
补充一下 q n q^n qn的计算:

Math.pow(q,n)

你可能感兴趣的:(java,算法)