华为2018实习春招笔试

记录一下今天华为笔试题,表示第二第三题无压力能解决,第一题刚上来代码通过百分之十,很无语,后面直接先放着,写后面。运气来的太好?我写到40几分钟,他们好多人都结束了,这有点夸张吧,神通广大呀,他们,虽然我给他们贡献了第二题,第三题!!!惊讶,后来,第一题我直接在群里问了下,小伙伴还是很给力的助力了一波,赞!特此来记录一番!

1、

[编程|100分] 字符串重排
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 32768K,其他语言 65536K
题目描述
给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。
举例!假设原始字符串为:
eeefgghhh
则每种字符出现的次数分别是:
(1).eee        3次
(2).f          1次
(3).gg         2次
(4).hhh        3次
重排输出后的字符串如下:
efghegheh
编写程序,实现上述功能。
【温馨提示】
(1).原始字符串中仅可能出现“数字”和“字母”;
(2).请注意区分字母大小写。

输入描述:
eeefgghhh
输出描述:
efghegheh
示例1
输入

eeefgghhh
输出

efghegheh

import java.util.Scanner;
public class Main {    
	public static void main(String[]args){        
		Scanner scanner = new Scanner(System.in);        
		String s = null;        
		int [] data = new int[128];        
		while (scanner.hasNext()){            
			s = scanner.nextLine();            
			char [] c = s.toCharArray();            
			int max = -1;            
			int length = c.length;            
			for(int i=0;i<length;i++){                
				data[c[i]-0]++;            
			}            
			for(int j=0; j<128;j++){                
				max = max>data[j]?max:data[j];            
			}            
			for(int k=0;k<max;k++){                
				for(int m=0;m<128;m++){                    
					if(data[m]!=0){                        
						data[m]--;                        
						System.out.print((char)m);                    
					}                
				}            
			}        
		}    
	}
} 

第二题、

[编程|200分] 跳跃比赛
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 32768K,其他语言 65536K
题目描述
给出一组正整数,你从第一个数向最后一个数方向跳跃,每次至少跳跃1格,每个数的值表示你从这个位置可以跳跃的最大长度。计算如何以最少的跳跃次数跳到最后一个数。
输入描述:
第一行表示有多少个数n
第二行开始依次是1到n个数,一个数一行
输出描述:
输出一行,表示最少跳跃的次数。
示例1
输入

7
2
3
2
1
2
1
5
输出

3
说明

7表示接下来要输入7个正整数,从2开始。数字本身代表可以跳跃的最大步长,此时有2种跳法,为2-2-2-5和2-3-2-5都为3步
思路:思路很重要,第一眼看过来,这题用动态规划来解,印象中这题在leetcode中遇到过,不知道还是在牛客网叶神视频中看过,一验证果不其然。其实也很简单,申明一個數組,默認存很大的值,儅到相應的n步數需要修改時,用动态转移公式
R[i+j]=Math.min(R[i+j],R[i]+1); 来替换数组里面值。
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int MAX = 100;
		int[] A = new int[MAX];
		int[] R = new int[MAX];
		int n;
		int INF=(1<<21); 
		n = scan.nextInt();
		for(int i = 0 ; i <n ;++i){
			A[i] = scan.nextInt();
			R[i] = INF;
		}
		R[0] = 0;    
    	for(int i = 0; i < n; ++i){    
        	for(int j = 1; j <= A[i] && i + j < n; ++j){    
           		R[i+j]=Math.min(R[i+j],R[i]+1);  
        	}    
    	}  
    	System.out.println(R[n-1]);
	}

}

第三题、
[编程|300分] 大数相乘
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++ 32768K,其他语言 65536K
题目描述
编写”长整数相乘”程序,实现两个任意长度的长整数(正数)相乘,输出结果.

输入描述:
第一行输入数字A的字符串,字符范围(0~9),第二行输入数字B的字符串,字符范围(0~9)。
输出描述:
输出A、B俩数相乘的结果,结果为字符串。
示例1
输入

1234
4321
输出

5332114
说明

第一排数字*第二排数字

import java.util.Scanner;   
public class Main{             
 public static void main(String[] args){               
	Scanner scan=new Scanner(System.in);               
	String numStr1=scan.next();               
	String numStr2=scan.next();                          
	int[] intNum1=changetoArray(numStr1);               
	int[] intNum2=changetoArray(numStr2);                          
	multiply(intNum1,intNum2);       
	}              
	
	public static int[] changetoArray(String numStr){               
		int length=numStr.length();               
		int[] intNum=new int[length];               
		for(int i=0;i<length;i++)               
		intNum[length-i-1]=Integer.parseInt(String.valueOf((numStr.charAt(i))));              
		return intNum;       
	}              
	
	public static void multiply(int[] num1,int[] num2){               
		int length1=num1.length;               
		int length2=num2.length;               
		int[] result=new int[length1+length2];               
		for(int i=0;i<length1;i++)               
		for(int j=0;j<length2;j++){                   
		int temp = result[i + j] + num1[i] * num2[j];                   
		result[i + j] = temp % 10;                   
		result[i + j + 1] += temp / 10;                   
		if (result[i + j + 1] > 10) {                       
			result[i + j + 1] %= 10;                       
			result[i + j + 2]++;                   
		}               
		}                  
		StringBuffer sb=new StringBuffer();               
		for(int i=result.length-1;i>=0;i--)              
		if(i==result.length-1 && result[i]==0){            	            
		
		}else{            	
			sb.append(result[i]);             
			
		}              
		System.out.println(sb.toString());         
		}  
	} 

猜你喜欢

转载自blog.csdn.net/u013013553/article/details/79887187