文章

逻辑题

有 3 升和 5 升两个杯子,水无限,怎么倒出来 4 升水呢?(货拉拉)

  1. 先把 5 升杯子倒满水水,再将 5 升杯子的水将 3 升杯子倒满,此时 5 升杯子有 2 升水,3 升杯子有 3 升水
  2. 再把 3 升水倒掉,把 5 升杯子的 2 升水导入 3 升杯子,此时 3 升杯子有 2 升水,5 升杯子空的
  3. 最后把 5 升杯子倒满水,然后再将 5 升杯子的水倒满 3 升杯子水(因为 3 升杯子有 2 升水了,所以只需要倒入 1 升水),此时 5 升杯子的水 5 升 -1 升=4 升水
  4. 这样 5 升杯子里还有 4 升水

一根不均匀绳子烧完需要一个小时,现在有若干这样的绳子,准确计时得到 45min

  1. 点燃 2 根绳子,1 根绳子 A 只点燃 1 端,另外 1 根绳子 B 点燃 2 端
  2. B 绳子烧完,此时耗时 30min,A 绳子只燃烧一半
  3. 这个时候再次点燃 A 绳子另外一端,等 A 绳子全部烧完,需要时间 15min
  4. 这个时候刚好就是 45min

Android xml 的空格解析

Android 中的文案都是通过 string.xml 来管理,而 xml 会把多个空格都解析为一个空格,为了能在 xml 里边正常录入多个空格,我们往往需要对空格进行转义,例如, 需要输入中间包含 4 个空格的语句,我们可能会这样写:
<string name="test">this is a &#160;&#160;&#160;test</string>
实现一个程序,给定明文字符串,把它输出符合 xml 格式的字符串(只考虑空格问题,不考虑其他 xml 转义),并且要求:
1. 如果两个字符间只有一个空格,那么就必须用空格表示, 例如上面的例子不能输出 this is a  test

思路:

  • 辅助:一个 StringBuilder,记录遍历过程中替换后的结果;一个队列/count int,用于记录遍历过程中空字符
  • 从头到尾遍历字符串
    • 字符为空,将字符添加到队列/count 加 1
    • 字符不为空
      • 看队列是否不为空/count>0,将第 0 个空字符 ' 'append 到 sb,第 1 个及以后的字符用 &#160; 替换
      • 将遍历的字符 append 到 sb
  • 遍历结束后,判断字符串后有空格
    • 队列不为空/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("&#160;");
            }
        } 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("&#160;");
                }
            }
            count = 0; // 空字符个数必须归零
            sb.append(ch);
        }
    }
    for (int j = 0; j < count; j++) {
        if (j == 0) {
            sb.append(" ");
        } else {
            sb.append("&#160;");
        }
    }
    return sb.toString();
}
本文由作者按照 CC BY 4.0 进行授权