华为2018校园优先招聘深圳地区笔试代码分享

第一题:括号匹配问题。

这一类问题是任何一本书在将Java栈处理的时候都会用到的,用栈处理是最方便的。

import java.util.Scanner;
import java.util.Stack;

public class Main{
     public static void main(String args[]){
         Scanner in = new Scanner(System.in);
         while(in.hasNext()){
             String str = in.next();
             System.out.println(check(str));
         }
         in.close();
     }
    public static boolean check(String str){
        Stack<Character> st = new Stack<Character>();
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)=='('||str.charAt(i)=='['||str.charAt(i)=='{')
                st.push(str.charAt(i));
            if(str.charAt(i)==')'){
                if(st.pop()!='(')
                    return false;
            }
            if(str.charAt(i)==']'){
                if(st.pop()!='[')
                    return false;
            }
            if(str.charAt(i)=='}'){
                if(st.pop()!='{')
                    return false;
            }
        }
        return true;
    }
}

第二题:类似于POJ3125,只不过这次问题要求是全部打印, 不知道问题出在哪里了,我这次只有60%的AC率,希望大佬来解答一下

解题思路:其实这种输出可以看成从最高优先级输出一遍, 然后再从最后一个最高优先级点开始,遍历一遍输出下一个优先级的所有文件,这时候只需要维护一个指针,指向上一级(或上上级,上上上级-取决于有没有这些级的文件)的最后一个输出文件的位置即可,然后从这个位置开始做当前级的文件输出并保留当前级文件最后一个点的位置。



import java.util.Scanner;

public class Main{
     public static void main(String args[]){
         Scanner in = new Scanner(System.in);
         while(in.hasNext()){
             String str = in.nextLine();
             int cnt = 0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)>='1' && str.charAt(i)<='9'){
                cnt++;
            }
        }
        int[] mat = new int[cnt];
        int[] count = new int[10];
        int flag = 0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)>='1' && str.charAt(i)<='9'){
                int num = Integer.parseInt(String.valueOf(str.charAt(i)));
                mat[flag] = num;
                count[num]++;
                flag++;
            }
        }

        StringBuffer res = new StringBuffer();
        int pos = 0;
        for(int i=9;i>0;i--){
            while(count[i]!=0){
                int chPos = pos%cnt;
                if(mat[chPos]==i){
                    res.append(chPos+", ");
                    count[i]--;
                }
                pos++;
            }
        }
        if(res.length()==0){
            System.out.println("");
        }else{
            System.out.println(res.substring(0,res.length()-2));
        }
         }
         in.close();
     }
}


第三题:左上角到右下角收集最多圣诞果问题。

解题思路:这个题是一个典型的dp问题,初始化第一行和第一列之后,利用当前i,j点一定是从i-1,j和i,j-1点最大的那个过来的概念,最终输出dp数组右下角元素即可。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int M = in.nextInt();
            int N = in.nextInt();
            int[][] arr = new int[M][N];
            for(int i=0;i<M;i++){
                for(int j=0;j<N;j++){
                    arr[i][j] = in.nextInt();
                }
            }
            int[][] dp = new int[M][N];
        dp[0][0] = arr[0][0];
        for(int i=1;i<N;i++){
            dp[0][i]=arr[0][i]+dp[0][i-1];
        }
        for(int i=1;i<M;i++){
            dp[i][0]=arr[i][0]+dp[i-1][0];
        }
        for(int i=1;i<M;i++){
            for(int j=1;j<N;j++){
                dp[i][j] = Math.max(dp[i-1][j]+arr[i][j],dp[i][j-1]+arr[i][j]);
            }
        }
        System.out.println(dp[M-1][N-1]);
        }
        in.close();
    }
}

猜你喜欢

转载自blog.csdn.net/u013576018/article/details/75070396