Restore IP Addresses

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)

Have you been asked this question in an interview? 

难度为3的题,属于排列的题目。
有几点细节容易出错:
递归的将数字串分成四个部分,每个部分满足0<=p<=255。要注意一些边界case,比如010是没有意思的,“0.10.010.1”. 
 最好用一个专门的方法来判断,比较清晰。
if (!(value.charAt(0) != '0' && Integer.parseInt(value) <= 255)) {
把上面这个写成了下面的样子,一直没看出来哪里出错
if (!(value.charAt(0) != 0 && Integer.parseInt(value) <= 255)) {
注意char 和 int 的0 是不一样的
3 由于IPaddress  里需要加 . ,最好单独用一个arraylist 来处理,把输出单独拿出来写,可以让思路清晰,也不容易出错 

public class Solution {
    public List<String> restoreIpAddresses(String s) {
        if (s == null) {
            return null;
        }
        List<String> result = new ArrayList<String>();
        ArrayList<String> address = new ArrayList<String>();
        restore(result, address, s, 0);
        return result;
    }
    private void restore(List<String> res, ArrayList<String> address, String s, int startPosition) {
        if (address.size() == 4 && startPosition >= s.length()) {
            res.add(printAddress(address));
            return;
        } else if (address.size() == 4 || startPosition >= s.length()) {
            return;
        }
        for (int i = 1; i <= 3; i++) {
            if (startPosition + i <= s.length()) { 
                String value = s.substring(startPosition, startPosition + i);
                if (i > 1) {
                    if (!(value.charAt(0) != '0' && Integer.parseInt(value) <= 255)) {
                        break;
                    }
                }
                address.add(value);
                restore(res, address, s, startPosition + i);
                address.remove(address.size() - 1);
            }
        }
    }
    private String printAddress(ArrayList<String> address) {
        StringBuilder sb = new StringBuilder();
        sb.append(address.get(0));
        for (int i = 1; i < address.size(); i++) {
            sb.append('.');
            sb.append(address.get(i));
        }
        return sb.toString();
    }
}


别人解法:

public class Solution {
    public ArrayList<String> restoreIpAddresses(String s) {
        ArrayList<String> result = new ArrayList<String>();
        ArrayList<String> list = new ArrayList<String>();
        
        if(s.length() <4 || s.length() > 12)
            return result;
        
        helper(result, list, s , 0);
        return result;
    }
    
    public void helper(ArrayList<String> result, ArrayList<String> list, String s, int start){
        if(list.size() == 4){
            if(start != s.length())
                return;
            
            StringBuffer sb = new StringBuffer();
            for(String tmp: list){
                sb.append(tmp);
                sb.append(".");
            }
            sb.deleteCharAt(sb.length()-1);
            result.add(sb.toString());
            return;
        }
        
        for(int i=start; i<s.length() && i<= start+3; i++){
            String tmp = s.substring(start, i+1);
            if(isvalid(tmp)){
                list.add(tmp);
                helper(result, list, s, i+1);
                list.remove(list.size()-1);
            }
        }
    }
    
    private boolean isvalid(String s){
        if(s.charAt(0) == '0')
            return s.equals("0"); // to eliminate cases like "00", "10"
        int digit = Integer.valueOf(s);
        return digit >= 0 && digit <= 255;
    }
}


独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)内容概要:本文围绕“独立储能的现货电能量与调频辅助服务市场出清协调机制”展开,提出了一种基于Matlab代码实现的优化模型,旨在协调独立储能系统在电力现货市场与调频辅助服务市场中的联合出清问题。文中结合鲁棒优化、大M法和C&CG算法处理不确定性因素,构建了多市场耦合的双层或两阶段优化框架,实现了储能资源在能量市场和辅助服务市场间的最优分配。研究涵盖了市场出清机制设计、储能运行策略建模、不确定性建模及求解算法实现,并通过Matlab仿真验证了所提方法的有效性和经济性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事电力市场、储能调度相关工作的工程技术人员。; 使用场景及目标:①用于研究独立储能在多电力市场环境下的协同优化运行机制;②支撑电力市场机制设计、储能参与市场的竞价策略分析及政策仿真;③为学术论文复现、课题研究和技术开发提供可运行的代码参考。; 阅读建议:建议读者结合文档中提供的Matlab代码与算法原理同步学习,重点关注模型构建逻辑、不确定性处理方式及C&CG算法的具体实现步骤,宜在掌握基础优化理论的前提下进行深入研读与仿真调试。
#include <iostream> #include <vector> #include <string> using namespace std; // 手动判断子串是否合法,并转为整数(避免 stoi 和 substr) bool isValidPart(const string& s, int start, int len) { if (len == 0 || len > 3) return false; if (len > 1 && s[start] == '0') return false; // 前导零非法 int num = 0; for (int i = 0; i < len; ++i) { char c = s[start + i]; if (c < '0' || c > '9') return false; // 非数字字符(其实题目保证只有数字) num = num * 10 + (c - '0'); } return num <= 255; } // 获取所有有效 IP 地址(无 substr,纯索引操作) vector<string> restoreIpAddresses(const string& s) { vector<string> result; int n = s.size(); // 剪枝:长度必须在 [4,12] if (n < 4 || n > 12) return result; // 枚举三段长度:l1, l2, l3(每段 1~3) for (int l1 = 1; l1 <= 3; ++l1) { if (l1 >= n) break; for (int l2 = 1; l2 <= 3; ++l2) { if (l1 + l2 >= n) break; for (int l3 = 1; l3 <= 3; ++l3) { int l4 = n - l1 - l2 - l3; if (l4 <= 0 || l4 > 3) continue; // 检查四段合法性 if (!isValidPart(s, 0, l1)) continue; if (!isValidPart(s, l1, l2)) continue; if (!isValidPart(s, l1+l2, l3)) continue; if (!isValidPart(s, l1+l2+l3, l4)) continue; // 手动构造结果字符串(避免多次 string 拼接开销) string ip; ip.reserve(16); // IP 最长如 "255.255.255.255" → 15 字符 // 第一段 for (int i = 0; i < l1; ++i) ip += s[i]; ip += '.'; // 第二段 for (int i = l1; i < l1+l2; ++i) ip += s[i]; ip += '.'; // 第三段 for (int i = l1+l2; i < l1+l2+l3; ++i) ip += s[i]; ip += '.'; // 第四段 for (int i = l1+l2+l3; i < n; ++i) ip += s[i]; result.push_back(ip); } } } return result; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { string s; cin >> s; vector<string> ips = restoreIpAddresses(s); if (ips.empty()) { cout << "-1\n"; } else { for (const string& ip : ips) { cout << ip << '\n'; } } } return 0; } 这个好像有点问题
11-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值