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

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

模糊坐标【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 )

目录
相关文章
|
5月前
|
Java
【每日一题Day121】LC1139最大的以 1 为边界的正方形 | 前缀和数组 + 枚举
【每日一题Day121】LC1139最大的以 1 为边界的正方形 | 前缀和数组 + 枚举
41 0
|
5月前
【每日一题Day345】LC2562找出数组的串联值 | 模拟
【每日一题Day345】LC2562找出数组的串联值 | 模拟
38 0
|
5月前
【每日一题Day292】LC1572矩阵对角线元素的和 模拟
【每日一题Day292】LC1572矩阵对角线元素的和 模拟
26 0
|
5月前
【每日一题Day191】LC2423删除字符使频率相同 | 枚举 分类讨论
【每日一题Day191】LC2423删除字符使频率相同 | 枚举 分类讨论
43 0
|
4月前
|
C++
【洛谷 P2241】统计方形(数据加强版)题解(循环枚举)
该题目是1997年普及组的一道编程题,要求计算$n\times m$棋盘中的正方形和长方形数量(不计正方形)。输入包含两正整数$n,m\leq 5000$。输出为一行,两个正整数分别表示正方形和长方形数量。示例输入`2 3`,输出`8 10`。解题思路是将矩形数拆分为正方形数和长方形数,然后通过双重循环计算。AC代码使用C++编写,通过累加方法得出结果。
40 0
|
5月前
【每日一题Day133】LC2373矩阵中的局部最大值 | 模拟
【每日一题Day133】LC2373矩阵中的局部最大值 | 模拟
47 0
|
5月前
【每日一题Day353】LC2525根据规则将箱子分类 | 模拟
【每日一题Day353】LC2525根据规则将箱子分类 | 模拟
28 0
|
5月前
【每日一题Day247】LC1401圆和矩形是否有重叠 | 数学
【每日一题Day247】LC1401圆和矩形是否有重叠 | 数学
38 0
|
5月前
【每日一题Day240】LC2481分割圆的最少切割次数 | fenlei
【每日一题Day240】LC2481分割圆的最少切割次数 | fenlei
29 0
|
5月前
【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟
【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟
43 0