1. 产生随机数
已知rand7()可以产生17的7个数(均匀概率),利用rand7() 产 生 rand10() 110(均匀概率)。
思路:
产生指定范围内的随机数就要求指定范围内每个数的产生概率都是相等的。
由于无法直接通过rand7()产生1-10的数,所以就要思考如何组合rand7()生成1~10n之间的数。
为了讨论方便,更符合我们平时使用的习惯,我们将rand7() - 1,就表示生成的是0~6之间的随机数。
i = rand7() - 1, j = rand7() - 1
那么7 * i + j 就可以看出一个7进制的数范围为0066(转换为十进制就是048),而且这些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的方格纸,里面有多少个正方形
总结规律得到:
证明:
1 3 6 石头问题
16个石子一次可以拿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();
}
}
}