[Leetcode学习-java]Ambiguous Coordinates(处理小数坐标)

问题:

难度:medium

说明:

题目给出一个 (123) 的字符串,括号,里面放一串数字,要求加入一个 , 逗号,然后再选择性放置 . 点符号,把这个字符串改为 (1, 2.3),(1, 23),(1.2, 3),(12, 3) 这样有了点和逗号分割的坐标字符串,不能重复,而且不允许无意义 0 和 点 就是 0.0、0.10、0.、1.、00、00.1 这种都有无意义的 0 和 点 都不能作为结果返回,返回一个 list 包含这些字符串,不用按顺序排列。

题目连接:https://leetcode.com/problems/ambiguous-coordinates/

输入范围:

  • 4 <= s.length <= 12.
  • s[0] = "(", s[s.length - 1] = ")", and the other elements in s are digits.

输入案例:

Example 1:
Input: s = "(123)"
Output: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]

Example 2:
Input: s = "(00011)"
Output:  ["(0.001, 1)", "(0, 0.011)"]
Explanation: 
0.0, 00, 0001 or 00.01 are not allowed.

Example 3:
Input: s = "(0123)"
Output: ["(0, 123)", "(0, 12.3)", "(0, 1.23)", "(0.1, 23)", "(0.1, 2.3)", "(0.12, 3)"]

Example 4:
Input: s = "(100)"
Output: [(10, 0)]
Explanation: 
1.0 is not allowed.

我的代码:

输入的长度也不长,所以轻松点用全排列,暴力就可以了,加个 stringbuilder 处理更快,

1、先找地方插入 , 逗号

2、校验第一个被分割的数字是否合法

3、如果 2 合法,校验第二个数字是否合法

Java:

    class Solution {
        public List<String> ambiguousCoordinates(String s) {
            s = s.replace("(", "").replace(")", "");
            StringBuilder appender = new StringBuilder();
            StringBuilder appender2 = new StringBuilder();
            List<String> res = new ArrayList<String>();
            for(int i = 1, len = s.length(); i < len; i ++) {
                String[] nums = new String[]{s.substring(0, i), s.substring(i, len)};

                appender.append(nums[0]);
                for(int j = 0, len0 = nums[0].length(); j < len0; j ++) {
                    if(j != 0) appender.insert(j, ".");
                    if(checkNum(appender.toString())) {
                        appender2.append(nums[1]);
                        for(int k = 0, len1 = nums[1].length(), orgLen = appender.length(); k < len1; k ++) {
                            if(k != 0) appender2.insert(k, ".");
                            if(checkNum(appender2.toString())) {
                                res.add(appender.insert(0, "(").append(", ").append(appender2).append(")").toString());
                                appender.deleteCharAt(0).setLength(orgLen);
                            }
                            if(k != 0) appender2.deleteCharAt(k);
                        }
                        appender2.setLength(0);
                    }
                    if(j != 0) appender.deleteCharAt(j);
                }
                appender.setLength(0);
            }
            return res;
        }

        public boolean checkNum(String num) {
            String[] ns = num.split("\\.");
            if(ns.length < 2 && num.indexOf(".") != -1) return false;
            if(ns[0].length() == 0) return false;
            if(ns[0].charAt(0) == '0' && ns[0].length() > 1) return false;
            if(ns.length == 2 && (ns[1].length() == 0 || ns[1].charAt(ns[1].length() - 1) == '0')) return false;
            return true;
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值