注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
这个是题目:
https://leetcode.com/problems/additive-number/
我已经翻译两天了,就是java这个substring问题死活应对不上,总是报错stringOutOfBound
求指出错误
思路是:
分别枚举下第一段和第二段的长度
并且计算一下两数之和
并且比较这个和与第三段子串是否匹配
否则的话,当前这种情况不合法,还需要去枚举「后面」一种情况
这种情况的时间是O(n^3)
helper function写的是 当处理高位数据时候的加法,先转换成array,再用array进行计算,最后结果转成字符串
这是c++的代码:
- class Solution {
- public:
- string add(string x, string y) {
- vector<int> A, B, C;
- for (int i = x.size() - 1; i >= 0; i -- ) A.push_back(x[i] - '0');
- for (int i = y.size() - 1; i >= 0; i -- ) B.push_back(y[i] - '0');
- for (int i = 0, t = 0; i < A.size() || i < B.size() || t; i ++ ) {
- if (i < A.size()) t += A[i];
- if (i < B.size()) t += B[i];
- C.push_back(t % 10);
- t /= 10;
- }
- string z;
- for (int i = C.size() - 1; i >= 0; i -- ) z += to_string(C[i]);
- return z;
- }
- bool isAdditiveNumber(string num) {
- for (int i = 0; i < num.size(); i ++ )
- for (int j = i + 1; j + 1 < num.size(); j ++ ) {
- int a = -1, b = i, c = j;
- while (true) {
- if (b - a > 1 && num[a + 1] == '0' || c - b > 1 && num[b + 1] == '0') break; // 有前导0
- auto x = num.substr(a + 1, b - a), y = num.substr(b + 1, c - b);
- auto z = add(x, y);
- if (num.substr(c + 1, z.size()) != z) break; // 下一个数不匹配
- a = b, b = c, c += z.size();
- if (c + 1 == num.size()) return true;
- }
- }
- return false;
- }
- };
复制代码
这是我照着翻译 有问题的java代码:
- public static boolean isAdditiveNumber(String num) {
- for (int i = 0; i < num.length(); i++) {
- for (int j = i + 1; j + 1 < num.length(); j++) {
- int a = -1, b = i, c = j;
- boolean isAdditive = true;
- while (isAdditive) {
- // 前缀0
- if (b - a > 1 && num.charAt(a + 1) == '0' || c - b > 1
- && num.charAt(b + 1) == '0') {
- isAdditive = false;
- break;
- }
-
- String x = num.substring(a + 1, b ),
- y = num.substring(b + 1, c),
- z = add(x, y);
- if (!num.substring(c+1, c+z.length()).equals(z)) { //主要是这行报错,stringOutOfBound
- isAdditive = false;
- break;
- }
- a = b;
- b = c;
- c += z.length();
- if (c + 1 == num.length())
- return true;
- }
- }
- }
- return false;
- }
- private static String add(String x, String y) {
- int[] A = new int[x.length()];
- int[] B = new int[y.length()];
- StringBuilder sb = new StringBuilder();
- for (int i = x.length() - 1; i >= 0; i--) {
- // 逆序放进去
- A[x.length() - i - 1] = x.charAt(i) - '0';
- }
- for (int i = y.length() - 1; i >= 0; i--) {
- // 逆序放进去
- A[y.length() - i - 1] = y.charAt(i) - '0';
- }
- for (int i = 0, t = 0; i < A.length || i < B.length || t != 0; i++) {
- // t为进位
- if (i < A.length)
- t += A[i];
- if (i < B.length)
- t += B[i];
- sb.append(t % 10);
- t /= 10;
- }
- return sb.reverse().toString();
- }
复制代码
求指出,感激🙏
|