华为2014年校园招聘机试题目与答案
2014-10-13(一) by chenjia.me写在前面
其实我想吐槽的是每次华为机试都能满分,可惜到最后都没面试机会。。。不知道HR是怎么想的。。
而且。。华为的心理测试真的是做了一次谁都不想做第二次。。。所以大家还是要认真的做的0.0
2014年秋季校园招聘机试题1
题目1
天数计算
描述: 输入一个含年月信息的字符串,仅支持信息格式MM-YYYY(MM:月份,YYYY:年份),根据该信息输出当月总天数。注意考虑闰年。
已知闰年是满足下列条件的年份:
(1) 公历年份是4的倍数且不是100的倍数
(2) 公历年份是400的倍数
例如,2000年是闰年,1900年则是平年。闰年2月份为29天,平年2月份为28天。
运行时间限制: 无限制
内存限制: 无限制
输入: 年月信息字符串
输出: 当月总天数>
样例输入: 03-2012
样例输出: 31
答案提示:
其实这道题目很简单。。switch-case就好~ 这是基础题目,一般计算机二级过了都可以
import java.util.Scanner;
public class Main1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
String str1=scanner.next();
String[] date=new String[2];
date=str1.split("-");
boolean flag=isflag(Integer.parseInt(date[1]));
switch (Integer.parseInt(date[0])) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(31);
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(30);
break;
case 2:{
if(flag){
System.out.println(29);
}else{
System.out.println(28);
}
}
}
//System.out.println("hello");
}
static boolean isflag(int i){
if(i%4==0){
if(i%100==0){
if(i%400==0){
return true;
}
else{
return false;
}
}
return true;
}
return false;
}
}
题目2
检查字符串中的左右括号是否匹配
描述: 编写一个函数,检查一个字符串中出现的括号“(”和“)”是否匹配。
比如字符串“(a+b*(9-6))”,该字符串的括号就是匹配的
又如字符串“(Gov)$Com)”,该字符串的括号就是不匹配的,右边多了一个”)”
若括号匹配返回1,若不匹配返回0,不考虑空字符串,字符串长度最长为128。
运行时间限制: 无限制
内存限制: 无限制
输入: 字符串
输出: 若括号匹配返回1,若不匹配返回0,不考虑空字符串
样例输入: (a+b*(9-6))
样例输出: 1
答案提示:
其实这个也很简单,复杂的方法用堆栈,简单的直接用int记录就好~因为就一个变量。(括号)
import java.util.Scanner;
import java.util.Stack;
public class Main2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
Stack stack=new Stack();
String str=scanner.nextLine();
int index=0;
while(true){
String c;
try {
c = str.substring(index, index+1);
} catch (StringIndexOutOfBoundsException e) {
// TODO Auto-generated catch block
break;
}
index++;
if(c.compareTo("(")==0){
stack.push(c);
}
if(c.compareTo(")")==0){
if(stack.empty()){
stack.push(c);
continue;
}
String top=stack.peek().toString();
//System.out.println("top"+top);
if(top.compareTo("(")==0){
stack.pop();
continue;
}
else{
stack.push(c);
}
}
}
if(stack.empty()){
System.out.println(1);
}
else{
System.out.println(0);
}
}
}
第三题
最大的正方形
描述: 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长
运行时间限制: 2 Sec
内存限制: 无限制
输入: 第一行输入两个整数n,m,之后n行,每行m个数字,为矩阵第i行第j列的值,只可能是0或者1
n,m<=400
输出: 一个整数,为最大正方形的边长
样例输入: 3 3
1 1 1
1 1 1
0 0 1
样例输出: 2
答案提示:
这道题不能用暴力解决,会TLE的。(N^3) 我们要用矩阵去存储最大的正方形的数据而不是存输入的数据。
即边输入边计算。(n^2)
import java.util.Scanner;
public class Main3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int m=scanner.nextInt();
int n=scanner.nextInt();
int max=0;
int[][] pic=new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
pic[i][j]=0;
int next=scanner.nextInt();
if(next==1){
int length;
int lflag=0;
try {
length = pic[i-1][j-1];
for(int k=1;k<=length;k++){
if(pic[i-k][j]==0||pic[i][j-k]==0){
lflag=k;
break;
}
}
} catch (ArrayIndexOutOfBoundsException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
length=1;
lflag=1;
}
if(lflag==0)lflag=length+1;
pic[i][j]=lflag;
//System.out.println(lflag);
if(lflag>max)max=lflag;
}
}
}
System.out.println(max);
}
}
总结
做了两次华为的机试,觉得软件的拿下前两道基本没问题,第三道一般都是比较有挑战的算法题,需要平时有一些学习才会了解。第一次华为机试的时候是一个递推原型,精简后是斐波那契数列原型。