当前位置: 首页 > 面试经验 >

华为5.6笔试思路 | 通过92%+25%+25%=217分

优质
小牛编辑
101浏览
2023-05-06

华为5.6笔试思路 | 通过92%+25%+25%=217分

Java选手,感觉第三题又被卡IO了。因为心态很崩,所以【代码写的很乱很不优雅】,所以先说思路供讨论,代码统一放在本文最后。

第一题,通过92%:把二进制字符串还原出来,然后遍历每个0的位置,记录该0和每个1的位置差,作为一个集合。把这些集合取交集,然后取出里面最小的正数(如果有)和最大的负数(如果有)就行了。特殊情况:字符串全1或最终的交集中存在0。

第二题,通过25%(我感觉我思路对的但很多用例没通过):自定义字符串加法。先在两个字符串前后补0,保证小数点是对齐的,然后定义竖式运算。最后得到的结果进行一些处理,如果不是以"0."开头则去掉开头的0,如果有小数点就去掉一些结尾的0,如果全去掉了那就把小数点也去掉。

第三题,通过25%(说超出CPU了,应该是卡IO?我用了Java快读都不行):一个我认为非常简单的广度优先搜索,类似树的层序遍历。图的本质是某些点在全部时间有障碍,某些点在某些时间有障碍。维护遍历的轮次(类似二叉树的层数),然后用队列遍历即可。这里每个格子接下来可以走的点是【上下左右及自身,这5个点中在该轮次%3的时间点无障碍的】。如果遍历到终点就返回该轮轮次就行。可惜只过了25%。

眼眶写的夸夸疼,摆了

代码附录:

第一题

package test1else;

import java.util.*;

public class Main {
    private static Map<Character, String> hexDigit = new HashMap<Character, String>() {{
        put('0', "0000");
        put('1', "0001");
        put('2', "0010");
        put('3', "0011");
        put('4', "0100");
        put('5', "0101");
        put('6', "0110");
        put('7', "0111");
        put('8', "1000");
        put('9', "1001");
        put('A', "1010");
        put('B', "1011");
        put('C', "1100");
        put('D', "1101");
        put('E', "1110");
        put('F', "1111");
    }};

    private static String getRes(int n, List<String> hexs) {
        StringBuilder tmpValue = new StringBuilder();
        for (String hex : hexs) for (int i = 2; i < hex.length(); ++i) tmpValue.append(hexDigit.get(hex.charAt(i)));
        String value = tmpValue.substring(0, n);
        List<String> output = new ArrayList<>();
        if (isAllOne(value)) output.add("0");
        else {
            int resCnt = 0;
            List<Integer> zeroIndex = new ArrayList<>();
            for (int i = 0; i < n; ++i) if (value.charAt(i) == '0') zeroIndex.add(i);
            Set<Integer> res = new TreeSet<>();
            Map<Integer, Set<Integer>> ab = new HashMap<>();
            for (int i = -n + 1; i <= n - 1; ++i) res.add(i);
            for (int idx : zeroIndex) {
                Set<Integer> tmp = new TreeSet<>();
                for (int i = 0; i < n; ++i) {
                    if (value.charAt(i) == '1') {
                        tmp.add(idx - i);
                        if (!ab.containsKey(idx - i)) ab.put(idx - i, new TreeSet<>());
                        ab.get(idx - i).add(i);
                    }
                }
                res.retainAll(tmp);
            }
            if (res.contains(0)) output.add("0");
            else {
                for (int i = 1; i < n; ++i) {
                    if (res.contains(i)) {
                        ++resCnt;
                        output.add("+" + i);
                        StringBuilder sb = new StringBuilder();
                        for (int j = 0; j < n; ++j) sb.append(ab.get(i).contains(j) ? '1' : '0');
                        output.add(sb.toString());
                        break;
                    }
                }
                for (int i = -1; i >= -n + 1; --i) {
                    if (res.contains(i)) {
                        ++resCnt;
                        output.add(Integer.toString(i));
                        StringBuilder sb = new StringBuilder();
                        for (int j = 0; j < n; ++j) sb.append(ab.get(i).contains(j) ? '1' : '0');
                        output.add(sb.toString());
                        break;
                    }
                }
                output.add(0, Integer.toString(resCnt));
            }
        }
        return String.join("\n", output);
    }

    private static boolean isAllOne(String s) {
        for (int i = 0; i < s.length(); ++i) if (s.charAt(i) == '0') return false;
        return true;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), tmp = n;
        List<String> hexs = new ArrayList<>();
        while (tmp > 0) {
            hexs.add(in.next());
            tmp -= 16;
        }
        System.out.println(getRes(n, hexs));
    }
}

第二题

import java.util.*;

public class Main {
    private static Map<Character, Map<Character, Integer>> sign = new HashMap<Character, Map<Character, Integer>>() {{
        put('!', new HashMap<Character, Integer>() {
            {
                put('!', 0);
                put('@', 13);
                put('#', 4);
            }
        });
        put('@', new HashMap<Character, Integer>() {
            {
                put('!', 13);
                put('@', 7);
                put('#', 20);
            }
        });
        put('#', new HashMap<Character, Integer>() {
            {
                put('!', 4);
                put('@', 20);
                put('#', 5);
            }
        });
    }};

    private static String getRes(int n, String str) {
        String[] parts = str.split("\\+");
        StringBuilder sb0 = new StringBuilder().append(parts[0]), sb1 = new StringBuilder().append(parts[1]);
        if (!parts[0].contains(".")) sb0.append(".0");
        if (!parts[1].contains(".")) sb1.append(".0");
        int p0 = sb0.indexOf("."), p1 = sb1.indexOf(".");
        int r0 = sb0.length() - p0, r1 = sb1.length() - p1;
        for (int i = 0; i < Math.max(r0, r1) - r0; ++i) sb0.append('0');
        for (int i = 0; i < Math.max(r0, r1) - r1; ++i) sb1.append('0');
        while (sb0.length() < sb1.length()) sb0.insert(0, '0');
        while (sb1.length() < sb0.length()) sb1.insert(0, '0');
        int jw = 0;
        StringBuilder res = new StringBuilder();
        for (int i = sb0.length() - 1; i >= 0; --i) {
            char ch0 = sb0.charAt(i), ch1 = sb1.charAt(i);
            if (ch0 == '.') res.insert(0, '.');
            else {
                int t;
                if (ch0 >= '0' && ch0 <= '9') t = ch0 - '0' + ch1 - '0' + jw;
                else t = sign.get(ch0).get(ch1);
                res.insert(0, t % 10);
                jw = t / 10;
            }
        }
        if (jw != 0) res.insert(0, jw);
        if (!res.toString().startsWith("0.")) while (res.charAt(0) == '0') res.replace(0, 1, "");
        if (res.toString().contains(".")) {
            while (res.charAt(res.length() - 1) == '0') res.replace(res.length() - 1, res.length(), "");
            if (res.charAt(res.length() - 1) == '.') res.replace(res.length() - 1, res.length(), "");
        }
        return res.toString();
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String str = in.next();
        System.out.println(getRes(n, str));
    }
}

第三题

import java.io.*;
import java.util.*;

public class Main {
    private static int getRes(int n, int[][] G, int[] start, int[] end, String[][] nones) {
        if (eq(start, end)) return 0;
        Queue<int[]> Q = new LinkedList<>();
        Q.add(start);
        int tune = 0;
        while (!Q.isEmpty()) {
            int cnt = Q.size();
            ++tune;
            while (cnt-- > 0) {
                int[] t = Q.poll();
                if (eq(t, end)) return tune - 1;
                List<int[]> neis = new ArrayList<int[]>() {{
                    add(new int[]{t[0], t[1]});
                    add(new int[]{t[0] - 1, t[1]});
                    add(new int[]{t[0] + 1, t[1]});
                    add(new int[]{t[0], t[1] - 1});
                    add(new int[]{t[0], t[1] + 1});
                }};
                for (int[] nei : neis) {
                    if (nei[0] < 0 || nei[0] >= n || nei[1] < 0 || nei[1] >= n) continue;
                    if (G[nei[0]][nei[1]] == 1) continue;
                    if (nones[nei[0]][nei[1]].charAt(tune % 3) == '1') continue;
                    Q.add(nei);
                }
            }
        }
        return -1;
    }

    private static boolean eq(int[] a, int[] b) {
        return a[0] == b[0] && a[1] == b[1];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer st = new StreamTokenizer(br);
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

        int n = getInt(st), k = getInt(st);
        int[][] G = new int[n][n];
        for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) G[i][j] = 0;
        for (int i = 0; i < k; ++i) G[getInt(st)][getInt(st)] = 1;
        int[] end = getIndex(st), start = getIndex(st);
        String[][] nones = new String[n][n];
        for (int i = 0; i < n; ++i) {
            String str = br.readLine();
            String[] tmp = str.split(" ");
            System.arraycopy(tmp, 0, nones[i], 0, n);
        }
        pw.println(getRes(n, G, start, end, nones));

        pw.flush();
    }

    private static int getInt(StreamTokenizer st) throws IOException {
        st.nextToken();
        return (int) st.nval;
    }

    private static int[] getIndex(StreamTokenizer st) throws IOException {
        int[] res = new int[2];
        res[0] = getInt(st);
        res[1] = getInt(st);
        return res;
    }
}

 类似资料: