查看: 1226| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[字符串] 问个需要从c++翻译成Java的字符串题

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
这个是题目:
https://leetcode.com/problems/additive-number/
我已经翻译两天了,就是java这个substring问题死活应对不上,总是报错stringOutOfBound
求指出错误
思路是:
分别枚举下第一段和第二段的长度
并且计算一下两数之和
并且比较这个和与第三段子串是否匹配

否则的话,当前这种情况不合法,还需要去枚举「后面」一种情况
这种情况的时间是O(n^3)

helper function写的是 当处理高位数据时候的加法,先转换成array,再用array进行计算,最后结果转成字符串

这是c++的代码:
  1. class Solution {
  2. public:

  3.     string add(string x, string y) {
  4.         vector<int> A, B, C;
  5.         for (int i = x.size() - 1; i >= 0; i -- ) A.push_back(x[i] - '0');
  6.         for (int i = y.size() - 1; i >= 0; i -- ) B.push_back(y[i] - '0');
  7.         for (int i = 0, t = 0; i < A.size() || i < B.size() || t; i ++ ) {
  8.             if (i < A.size()) t += A[i];
  9.             if (i < B.size()) t += B[i];
  10.             C.push_back(t % 10);
  11.             t /= 10;
  12.         }
  13.         string z;
  14.         for (int i = C.size() - 1; i >= 0; i -- ) z += to_string(C[i]);
  15.         return z;
  16.     }

  17.     bool isAdditiveNumber(string num) {
  18.         for (int i = 0; i < num.size(); i ++ )
  19.             for (int j = i + 1; j + 1 < num.size(); j ++ ) {
  20.                 int a = -1, b = i, c = j;
  21.                 while (true) {
  22.                     if (b - a > 1 && num[a + 1] == '0' || c - b > 1 && num[b + 1] == '0') break;  // 有前导0
  23.                     auto x = num.substr(a + 1, b - a), y = num.substr(b + 1, c - b);
  24.                     auto z = add(x, y);
  25.                     if (num.substr(c + 1, z.size()) != z) break;  // 下一个数不匹配
  26.                     a = b, b = c, c += z.size();
  27.                     if (c + 1 == num.size()) return true;
  28.                 }
  29.             }

  30.         return false;
  31.     }
  32. };
复制代码



这是我照着翻译 有问题的java代码:
  1. public static boolean isAdditiveNumber(String num) {
  2.                 for (int i = 0; i < num.length(); i++) {
  3.                         for (int j = i + 1; j + 1 < num.length(); j++) {
  4.                                 int a = -1, b = i, c = j;
  5.                                 boolean isAdditive = true;
  6.                                 while (isAdditive) {
  7.                                         // 前缀0
  8.                                         if (b - a > 1 && num.charAt(a + 1) == '0' || c - b > 1
  9.                                                         && num.charAt(b + 1) == '0') {
  10.                                                 isAdditive = false;
  11.                                                 break;
  12.                                         }
  13.                                                                                                                                                
  14.                                         String x = num.substring(a + 1, b ),
  15.                                                         y = num.substring(b + 1, c),
  16.                                                         z = add(x, y);                                       
  17.                                         if (!num.substring(c+1, c+z.length()).equals(z)) {  //主要是这行报错,stringOutOfBound
  18.                                                 isAdditive = false;
  19.                                                 break;
  20.                                         }
  21.                                         a = b;
  22.                                         b = c;
  23.                                         c += z.length();
  24.                                         if (c + 1 == num.length())
  25.                                                 return true;
  26.                                 }
  27.                         }
  28.                 }
  29.                 return false;
  30.         }

  31.         private static String add(String x, String y) {
  32.                 int[] A = new int[x.length()];
  33.                 int[] B = new int[y.length()];
  34.                 StringBuilder sb = new StringBuilder();

  35.                 for (int i = x.length() - 1; i >= 0; i--) {
  36.                         // 逆序放进去
  37.                         A[x.length() - i - 1] = x.charAt(i) - '0';
  38.                 }

  39.                 for (int i = y.length() - 1; i >= 0; i--) {
  40.                         // 逆序放进去
  41.                         A[y.length() - i - 1] = y.charAt(i) - '0';
  42.                 }

  43.                 for (int i = 0, t = 0; i < A.length || i < B.length || t != 0; i++) {
  44.                         // t为进位
  45.                         if (i < A.length)
  46.                                 t += A[i];
  47.                         if (i < B.length)
  48.                                 t += B[i];
  49.                         sb.append(t % 10);
  50.                         t /= 10;
  51.                 }
  52.                 return sb.reverse().toString();
  53.         }
复制代码



求指出,感激🙏

上一篇:449题 第33行 啥意思?
下一篇:Leetcode 323 - Union-Find bug 求解
🔗
usr_opta 2020-9-8 08:02:04 | 只看该作者
全局:
建议在每次循环的时候都把abcxyz的值打印出来,然后你就会发现你的c+1 = 2, c + z.length() = 1
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2020-9-8 09:16:35 | 只看该作者
全局:
usr_opta 发表于 2020-9-8 08:02
建议在每次循环的时候都把abcxyz的值打印出来,然后你就会发现你的c+1 = 2, c + z.length() = 1

是的,可我不知道怎么改对,c++能行的java就不太行
回复

使用道具 举报

🔗
xiaomajia001 2020-9-8 14:57:10 | 只看该作者
全局:
单步调试一下就知道了
回复

使用道具 举报

🔗
 楼主| akdhfikbk 2020-9-8 15:05:57 | 只看该作者
全局:
xiaomajia001 发表于 2020-9-8 14:57
单步调试一下就知道了

我不知道..
调试成功就不会发出来了
回复

使用道具 举报

🔗
xiaomajia001 2020-9-8 16:08:40 | 只看该作者
全局:
akdhfikbk 发表于 2020-9-8 15:05
我不知道..
调试成功就不会发出来了

首先说明我没有恶意啊。但是你这么说我要怀疑你不知道什么是单步调试了,你可以分辨清step over和step into,以及breakpoint和watchpoint的区别吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表