华为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&lt;m;i++){
            for(int j=0;j&lt;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&lt;=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&gt;max)max=lflag;
                    }
                }

            }
        System.out.println(max);
    }

}

总结

做了两次华为的机试,觉得软件的拿下前两道基本没问题,第三道一般都是比较有挑战的算法题,需要平时有一些学习才会了解。第一次华为机试的时候是一个递推原型,精简后是斐波那契数列原型。


Comments