2018华为春招IT应用软件开发实习题解

第一题:
import java.util.*;
/*
 给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。  
举例!假设原始字符串为:  eeefgghhh  
则每种字符出现的次数分别是:  
(1)eee        3次  
(2)f          1次  
(3)gg         2次  
(4)hhh        3次  
重排输出后的字符串如下:  
efghegheh  
 */
public class ResortStr {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		while(s.hasNext()) {
			//统计字符串中各个字符出现的次数
			String str = s.next();
			Map<Character, Integer> map = new TreeMap<Character, Integer>();
			for(int i = 0;i < str.length();i ++) {
				char c = str.charAt(i);
				if(map.containsKey(c)) {
					int value = map.get(c);
					map.put(c, ++ value);
				}
				else {
					map.put(c, 1);
				}
			}
			//寻找最大出现次数(即循环次数),并追加字符串
			Collection<Integer> values = map.values();
			int max = Collections.max(values);			
			StringBuffer sb = new StringBuffer();
			for(int i = 0;i < max;i ++) {
				for(char c : map.keySet()) {
					int value = map.get(c);
					if(value != 0) {
						sb.append(c);
						map.put(c, --value);	//用过了之后次数就减1
					}
				}
			}
			System.out.println(sb.toString());
		}
	}
}
第二题:
/*
 * 编写”长整数相乘”程序,实现两个任意长度的长整数(正数)相乘,输出结果.  
 * 第一行输入数字A的字符串,字符范围(0~9),第二行输入数字B的字符串,字符范围(0~9)。
 * 输出A、B俩数相乘的结果,结果为字符串。    例如:输入1234 4321 输出5332114  
 * 注:str1的长度是m,str2的长度是n,两个数相乘后的长度可能是m+n,也可能是m+n-1,结果数组的长度以m+n为准
 * 结果数组上每一位上的乘积构成:两个数组对应位置上的乘积+结果数组原有位置上的数+进位
 * 结果数组上每一位上的数:乘积%10
 * 结果数组上每一位上的进位:乘积/10
 */
import java.util.Scanner;
public class StringMultiplication{
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        while(s.hasNext()) {
	        String str1 = s.nextLine();
	        String str2 = s.nextLine();     
	        int len1 = str1.length();
	        int len2 = str2.length();   
	        int[] result = new int[len1 + len2]; 
	        int carry, multi, i, j;
	        for(i = len1 - 1;i >= 0;i --) {
	        	 carry = 0;
	        	 for(j = len2 - 1;j >= 0;j --) {
	        		 multi = (str1.charAt(i) - '0') * (str2.charAt(j) - '0') + result[i + j + 1] + carry;
	        		 result[i + j + 1] = multi % 10;
	        		 carry = multi / 10;
	        	 }
	        	 result[i + j + 1] = carry;
	        }	  
	        //判断高位是否存在0,找到第一个不为0的位置
	        i = 0;
	        while(i < result.length && result[i] == 0) {
	        	i ++;
	        }
	        StringBuffer sb = new StringBuffer();
	        for(;i < result.length;i ++) {
	        	sb.append(result[i]);
	        }
	        System.out.println(sb.toString());
        }
    }
}
第三题:
import java.util.*;
/*
 * 给出一组正整数,你从第一个数向最后一个数方向跳跃,每次至少跳跃1格,
 * 每个数的值表示你从这个位置可以跳跃的最大长度。计算如何以最少的跳跃次数跳到最后一个数。  
 */
public class JumpGame{
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        while(s.hasNext()) {
	        int len = s.nextInt();
	        int A[] = new int[len];
	        for(int j = 0; j < len; j ++){
	            A[j] = s.nextInt();
	        }
	        int i = 0;
	        int count = 0;
	        while(i < len - 1) {  
	        	count ++;
	        	int p1 = i + 1;		//当前可跳跃的起点
	        	int p2 = i + A[i];	//当前可跳跃的终点
	        	if(p2 >= len - 1)	//终点超出了数组长度,直接跳出循环
	        		break;    
	        	//寻找区间范围内可跳最远距离的元素下标
	    		int max = p1 + A[p1];
	    		int maxIndex = p1;
	    		for(int j = p1 + 1;j <= p2 && j < len;j ++) {
	    			int temp = j + A[j];
	    			if(temp > max) {
	    				max = temp;
	    				maxIndex = j;
	    			}
	    		}
	    		i = maxIndex;
	        }
	        System.out.println(count);
        }
    }
}

点赞