友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

816. 模糊坐标

我们有一些二维坐标,如 (1, 3)(2, 0.5),然后我们移除所有逗号,小数点和空格,得到一个字符串`S`。返回所有可能的原始字符串到一个列表中。

原始的坐标表示法不会存在多余的零,所以不会出现类似于"00", "0.0", "0.00", "1.0", "001", "00.01"或一些其他更小的数来表示坐标。此外,一个小数点前至少存在一个数,所以也不会出现“.1”形式的数字。

最后返回的列表可以是任意顺序的。而且注意返回的两个数字中间(逗号之后)都有一个空格。

示例 1:
输入: "(123)"
输出: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]
示例 2:
输入: "(00011)"
输出:  ["(0.001, 1)", "(0, 0.011)"]
解释:
0.0, 00, 0001 或 00.01 是不被允许的。
示例 3:
输入: "(0123)"
输出: ["(0, 123)", "(0, 12.3)", "(0, 1.23)", "(0.1, 23)", "(0.1, 2.3)", "(0.12, 3)"]
示例 4:
输入: "(100)"
输出: [(10, 0)]
解释:
1.0 是不被允许的。

提示:

  • 4 <= S.length <= 12.

  • S[0] = (, S[S.length - 1] = ), 且字符串 S 中的其他元素都是数字。

思路分析

将字符串进行分割,然后给每个分割的字符串添加小数点,要排除非法数字的情况。

0816 10
  • 一刷

 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
32
33
34
35
36
37
38
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-07-11 21:53:24
 */
public List<String> ambiguousCoordinates(String s) {
  s = s.substring(1, s.length() - 1);
  List<String> result = new ArrayList<>();
  for (int i = 1; i < s.length(); i++) {
    List<String> heads = toDecimal(s.substring(0, i));
    if (heads.isEmpty()) {
      continue;
    }
    List<String> tails = toDecimal(s.substring(i));
    if (tails.isEmpty()) {
      continue;
    }
    for (String h : heads) {
      for (String t : tails) {
        result.add('(' + h + ", " + t + ')');
      }
    }
  }
  return result;
}

private List<String> toDecimal(String s) {
  List<String> result = new ArrayList<>();
  for (int i = 0; i < s.length(); i++) {
    String d = (i > 0 ? s.substring(0, i) + '.' : "") + s.substring(i);
    if ((d.charAt(0) == '0' && d.length() > 1 && d.charAt(1) != '.')
      || (d.contains(".") && d.charAt(d.length() - 1) == '0')) {
      continue;
    }
    result.add(d);
  }
  return result;
}