腾讯笔试题总结

1. 产生随机数

已知rand7()可以产生1~7的7个数(均匀概率),利用rand7() 产 生 rand10() 1~10(均匀概率)。
思路:
产生指定范围内的随机数就要求指定范围内每个数的产生概率都是相等的。
由于无法直接通过rand7()产生1-10的数,所以就要思考如何组合rand7()生成1~10n之间的数。
为了讨论方便,更符合我们平时使用的习惯,我们将rand7() - 1,就表示生成的是0~6之间的随机数。
i = rand7() - 1, j = rand7() - 1
那么7 * i + j 就可以看出一个7进制的数范围为00~66(转换为十进制就是0~48),而且这些7进制数的产生概率都是一样的,每个数都是1/48,所以我们取0~39的这40个数,它们的概率也是相同的。余10加1就实现了rand10()。

int rand10() {
    int i = rand7() - 1;
    int j = rand7() - 1;
    int num = 7 * i + j;
    if(num >= 40)
         return rand10();
    else
         return num % 10 + 1;
}

2. 字符替换

orginal=”abcabc1234”
sub=”ab”,
replace=”xyz”
将orginal中出现sub串替换为replace串
上面例子返回:“xyzcxyzc1234”

public static String replace(String s, String sub, String replace) {
        if(s == null || sub == null || replace == null) return s;
        int len = sub.length();
        int pre = 0;
        int pos = 0;
        StringBuilder sb = new StringBuilder();
        while((pos = s.indexOf(sub, pos)) != -1) {
            sb.append(s.substring(pre, pos));
            sb.append(replace);

            pos = pos + len;
            pre = pos;
        }
        sb.append(s.substring(pre));
        return sb.toString();
    }

3. 正方形

N * N的方格纸,里面有多少个正方形
总结规律得到:

12+22+32+...+n2=n(n+1)(2n+1)/6

证明:
腾讯笔试题总结_第1张图片

1 3 6 石头问题

让对方进入必败点

public static void solveStoneProblem(int number) {
        if(number < 0)
            return;
        int[] legalMoves = {1, 3, 6};
        boolean[] win = new boolean[number+1];
        ArrayDeque<Integer> queue = new ArrayDeque<>();
        for(int i = 1; i <= number; i++) {
            for(int move : legalMoves) {
                int diff = i - move;
                if(diff >= 0 && !win[diff]) {
                    queue.addLast(move);
                    win[i] = true;
                }
            }

            System.out.print("when gives you " + i + " stones, you");
            if(win[i]) {
                System.out.print(" win, you choose : ");
                while(!queue.isEmpty()) {
                    System.out.print(queue.pollFirst() + " ");
                }
                System.out.println();
            }else {
                System.out.print(" lose");
                System.out.println();
            }
        }
    }

你可能感兴趣的:(腾讯笔试题总结)