【每日一题Day20】LC816 模糊坐标 | 枚举 模拟

模糊坐标【LC816】

We had some 2-dimensional coordinates, like "(1, 3)" or "(2, 0.5)". Then, we removed all commas, decimal points, and spaces and ended up with the string s.

  • For example, "(1, 3)" becomes s = "(13)" and "(2, 0.5)" becomes s = "(205)".

Return a list of strings representing all possibilities for what our original coordinates could have been.

Our original representation never had extraneous zeroes, so we never started with numbers like "00", "0.0", "0.00", "1.0", "001", "00.01", or any other number that can be represented with fewer digits. Also, a decimal point within a number never occurs without at least one digit occurring before it, so we never started with numbers like ".1".

The final answer list can be returned in any order. All coordinates in the final answer have exactly one space between them (occurring after the comma.)

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

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

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

新的一周加油呀=)

  • 思路:将该字符串除去首字符和最后一个字符后,分为两段,记为sub1和sub2,然后遍历sub1和sub2添加小数点或者不添加小数点所有可能性,分别放入结果集x和y中,那么最终的结果即为x和y的组合

  • 将某个字符串转化为合法坐标

    • 如果字符串长度为1,直接返回
    • 如果第一个数字是0,并且最后一位不是0,才有可能存在合法下标
      • s.substring(start,start+1) + "." + s.substring(start+1,end+1)
      • 非法0.10
    • 如果第一个数字不是0
      • 不添加小数点,将整个字符串作为坐标
      • 添加小数点【如果最后一位不是0,才可以添加小数点】
        • 11.10 1.110 非法
  • 代码

    class Solution {
        public List<String> ambiguousCoordinates(String s) {
            int len = s.length();
            List<String> res = new ArrayList<>(); 
            StringBuilder sb = new StringBuilder();
            for (int i = 1; i + 1 <= len - 2 ; i++){
                List<String> x = findCoor(s,1,i);
                List<String> y = findCoor(s,i+1,len-2);
                for (int j = 0; j < x.size(); j++){
                    for (int k = 0; k < y.size(); k++){
                        res.add("(" + x.get(j) + ", " + y.get(k) + ")");
                    }
                }            
            }
            return res;
        }
        public List<String> findCoor(String s,int start,int end){
            List<String> coor = new ArrayList<>();
            char c = s.charAt(start);       
            if (start == end){
                coor.add(s.substring(start,end+1));
            }else if(c == '0' && s.charAt(end) != '0'){// 首数字为0
                // 如果不全部为0,添加至结果集   
                coor.add(s.substring(start,start+1) + "." + s.substring(start+1,end+1));                     
            }else if (c != '0'){
                // 不添加小数点
                coor.add(s.substring(start,end+1));
                // 首数字不为0 根据下标添加小数点
                if (s.charAt(end) != '0'){// 如果末尾有0 那么不能添加小数点
                    for (int i = start; i < end; i++){
                        coor.add(s.substring(start,i+1) + "." + s.substring(i+1,end+1)); 
                    }
                }              
            }
            return coor;
        }
    }
    
  • 复杂度

    • 时间复杂度: O ( n 3 ) O(n^3) O(n3)
    • 空间复杂度: O ( n 3 ) O(n^3) O(n3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值