华为校招 - 通用软开 8月12日 笔试

2020-08-12  本文已影响0人  AlexLJS

我觉得这场笔试相对基础, 可能我抽题的运气比较好?记录一下供大家参考。
(看了8月5日的笔试题, 听说特坑,各种用例错误)

可,最后一题还是只通过了 75% 的 case,纠结四五十分钟也每天调出来,唉
ps : 不要纠结代码效率, 笔试我怎么写顺手就怎么写了,主要因为菜。

一、找零钱

题目 :

你是咖啡店店员卖咖啡 5块一杯。顾客排队买咖啡, 初始手里没零钱,判断你能否找零。钱的面值只有 5、10、20 三种。

输入 :
5,5,5, 10

用户持币买咖啡的 ,金额队列。

输出 :
true,4

全部能找零成功就返回 true 和 最后是第几号顾客。

不能找零成功,则返回 false,不能找零成功的顾客编号。

思路 :
hashmap 使用, 特点就是麻烦!题干不好懂, 华为笔试通病……

package Huawei;

import Utils.PrintUtil;

import java.util.*;

public class Main1 {
    /**
     * A-Z 65-90 a-z 97-122 0-1 48-57
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String[] input = in.nextLine().split(",");
            int[] data = new int[input.length];
            for (int i = 0; i < input.length; i++) {
                data[i] = Integer.valueOf(input[i]);
            }

            HashMap<Integer,Integer> m = new HashMap<>();
            m.put(5,0);
            m.put(10,0);
            m.put(20,0);

            int index = 1;
            boolean b = true;
            for (int i = 0; i < data.length; i++) {
                int cur = data[i];
//                int total
                if ( cur == 5){
                    index++;
                    m.put(5,m.get(5) + 1);
                }else if (cur == 10){
                    if (m.get(5) > 0){
                        m.put(5, m.get(5) - 1);
                        m.put(10, m.get(10) + 1);
                        index++;
                    }else {
                        System.out.println("false," + index);
                        b = false;
                        break;
                    }
                }else if (cur == 20){
                    if (m.get(5) >= 3){
                        m.put(5,m.get(5)-3);
                        m.put(20,m.get(20)+1);
                        index++;
                        continue;
                    }else if (m.get(5) > 0 && m.get(10)>0){
                        m.put(5,m.get(5)-1);
                        m.put(10,m.get(10)-1);
                        m.put(20,m.get(20)+1);
                        index++;
                        continue;
                    }else {
                        System.out.println("false," + index);
                        b = false;
                        break;
                    }
                }else {
                    System.out.println("false," + index);
                    b = false;
                    break;
                }
            }
            if (b) System.out.println("true,"+ --index);
        }
    }

}

二、迷宫问题

题目 :
(又给了一对情景, balabala)

本质是 , 走迷宫,这次是 矩阵值为 1 的能走, 每次走的步数提前约定好(可变)。

输入:
2
3 5
1 0 1 1 1
0 0 1 0 1
1 0 1 0 1

第一行步长,剩下的是矩阵参数

输出:
true

思路 :
经典回溯

package Huawei;

import java.util.*;


public class Main2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            int step = Integer.valueOf(in.nextLine());
            String[] line2 = in.nextLine().split(" ");
            int m = Integer.valueOf(line2[0]);
            int n = Integer.valueOf(line2[1]);
            int[][] matrix = new int[m][n];
            int[][] path = new int[m][n];

            for (int i = 0; i < m; i++) {
                String[] tempLine = in.nextLine().split(" ");
                for (int j = 0; j < n; j++) {
                    matrix[i][j] = Integer.valueOf(tempLine[j]);
                }
            }

            int res = process(matrix,path,0,0,step)?1:0;
            System.out.println(res);
        }
    }

    private static boolean process(int[][] matrix, int[][] path, int x, int y , int step){

        if (x < 0 || y < 0 || x >= matrix.length || y >= matrix[0].length
        || matrix[x][y] == 0 || path[x][y] == 1) return false;

        if (x == matrix.length - 1 && y == matrix[0].length - 1) return true;

        path[x][y] = 1;

        if (process(matrix,path,x + step, y,step)
        ||process(matrix,path,x,y + step,step)
        ||process(matrix,path,x - step, y,step)
        ||process(matrix,path,x, y - step,step)
        ){
            return true;
        }else {
            path[x][y] = 0;
            return false;
        }
    }
}

三、X型输出字符串

题目 :
(又又又又很晦涩,没见过, 也是自己刷题少…)
给一个字符串 s ,一个行宽 n 。 按 x型 把字符串排列好,再纵向遍历打印出来。。。

太绕了 举个例子:

输入:
abcdefg,3

过程 :空格我暂用#
[a # b]
[# c #]
[d # e]
[# f #]
[g # #]

输出:
adgcfbe

大概是这个意思吧。
对了 , 题目保证输入数据正确性

思路:
没啥思路。。所以,我硬生生把矩阵的高算出来了,用分组分块的方式……没眼看

(还没想清楚 25%的case 是啥情况)

package Huawei;

import Utils.PrintUtil;

import java.util.Scanner;

public class Main3 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String[] line = in.nextLine().split(",");
            String str = line[0];
            int n = Integer.valueOf(line[1]);

            // 计算矩阵高度 m
            int l = str.length();
            int i = l/(2*n - 3);
            int left = l%(2*n - 3);
            if (left >= n) i++;
            if (left%2 == 1) i++;
            int m = (l + i) / 2;

            //System.out.println(m);
            char[][] matrix = new char[m][n];
            int cur = 0;
            int strIndex = 0;
            for (int j = 0; j < m; j++) {

                for (int k = 0; k < n; k++) {
                    if ((k == cur || k == n-1-cur) && strIndex < l){
                        matrix[j][k] = str.charAt(strIndex++);
                    }
                }
                if (cur == n - 1){
                    cur = 1;
                }else {
                    cur++;
                }
            }
            //PrintUtil.printMatrix(matrix);
            String res = "";

            for (int j = 0; j < n; j++) {
                for (int k = 0; k < m; k++) {
                    if (matrix[k][j] != matrix[0][1]){
                        res += matrix[k][j];
                    }
                }
            }
            System.out.println(res);
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读