逻辑题
有 3 升和 5 升两个杯子,水无限,怎么倒出来 4 升水呢?(货拉拉)
- 先把 5 升杯子倒满水水,再将 5 升杯子的水将 3 升杯子倒满,此时 5 升杯子有 2 升水,3 升杯子有 3 升水
- 再把 3 升水倒掉,把 5 升杯子的 2 升水导入 3 升杯子,此时 3 升杯子有 2 升水,5 升杯子空的
- 最后把 5 升杯子倒满水,然后再将 5 升杯子的水倒满 3 升杯子水(因为 3 升杯子有 2 升水了,所以只需要倒入 1 升水),此时 5 升杯子的水 5 升 -1 升=4 升水
- 这样 5 升杯子里还有 4 升水
一根不均匀绳子烧完需要一个小时,现在有若干这样的绳子,准确计时得到 45min
- 点燃 2 根绳子,1 根绳子 A 只点燃 1 端,另外 1 根绳子 B 点燃 2 端
- B 绳子烧完,此时耗时 30min,A 绳子只燃烧一半
- 这个时候再次点燃 A 绳子另外一端,等 A 绳子全部烧完,需要时间 15min
- 这个时候刚好就是 45min
Android xml 的空格解析
Android 中的文案都是通过 string.xml 来管理,而 xml 会把多个空格都解析为一个空格,为了能在 xml 里边正常录入多个空格,我们往往需要对空格进行转义,例如, 需要输入中间包含 4 个空格的语句,我们可能会这样写:
<string name="test">this is a    test</string>
实现一个程序,给定明文字符串,把它输出符合 xml 格式的字符串(只考虑空格问题,不考虑其他 xml 转义),并且要求:
1. 如果两个字符间只有一个空格,那么就必须用空格表示, 例如上面的例子不能输出 this is a test
思路:
- 辅助:一个 StringBuilder,记录遍历过程中替换后的结果;一个队列/count int,用于记录遍历过程中空字符
- 从头到尾遍历字符串
- 字符为空,将字符添加到队列/count 加 1
- 字符不为空
- 看队列是否不为空/count>0,将第 0 个空字符
' '
append 到 sb,第 1 个及以后的字符用 
替换 - 将遍历的字符 append 到 sb
- 看队列是否不为空/count>0,将第 0 个空字符
- 遍历结束后,判断字符串后有空格
- 队列不为空/count 不为 0,说明字符串后面全部是字符串了,还要将空串进行替换
代码 1:队列方式记录空串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static String transform(String input) {
StringBuilder sb = new StringBuilder();
Queue<String> queue = new LinkedList<>();
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (ch == ' ') { // 遇到空字符,加入到队列queue
if (queue.isEmpty()) {
queue.offer(" ");
} else {
queue.offer(" ");
}
} else { // 遇到非空字符,替换空字符
// 如果queue不为空,说明前面有空字符,替换
while (!queue.isEmpty()) {
sb.append(queue.poll());
}
// 最后把字符添加到最后
sb.append(ch);
}
}
while (!queue.isEmpty()) {
sb.append(queue.poll());
}
// 这样的代码有问题,queue.size在poll()后size就少了一个
// for (int j = 0; j < queue.size(); j++) {
// sb.append(queue.poll());
// System.out.println("j=" + j + ",queue.size()=" + queue.size());
// }
return sb.toString();
}
代码 2:int 值记录空串个数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static String transform2(String input) {
StringBuilder sb = new StringBuilder();
int count = 0; // 空字符的个数
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (ch == ' ') {
count++;
} else {
for (int j = 0; j < count; j++) {
if (j == 0) {
sb.append(" ");
} else {
sb.append(" ");
}
}
count = 0; // 空字符个数必须归零
sb.append(ch);
}
}
for (int j = 0; j < count; j++) {
if (j == 0) {
sb.append(" ");
} else {
sb.append(" ");
}
}
return sb.toString();
}
本文由作者按照 CC BY 4.0 进行授权