Java 提交解决方案和运行代码对LeetCode的不同结果

Java 提交解决方案和运行代码对LeetCode的不同结果,java,c++,Java,C++,我正在研究LeetCode问题。但在运行代码和提交解决方案之间,我得到了两个不同的结果。我的C++代码是< /p> class Solution { public: int lengthOfLongestSubstring(string s) { int* a = new int[257]; int ans = 0; int n = s.size(); for (int j = 0, i = 0; j < n; j++

我正在研究LeetCode问题。但在运行代码和提交解决方案之间,我得到了两个不同的结果。我的C++代码是< /p>
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int* a = new int[257];
        int ans = 0;
        int n = s.size();
        for (int j = 0, i = 0; j < n; j++) {
            i = i > a[s[j]] ? i : a[s[j]];
            ans = ans > j - i +1 ? ans : j - i + 1;
            a[s[j]] = j + 1;
        }
        return ans;
    }
};
类解决方案{
公众:
int lengthOfLongestSubstring(字符串s){
int*a=新的int[257];
int ans=0;
int n=s.size();
对于(int j=0,i=0;ja[s[j]]?i:a[s[j]];
ans=ans>j-i+1?ans:j-i+1;
a[s[j]=j+1;
}
返回ans;
}
};
两个输出是 我不知道我的代码出了什么问题。此外,我的C++代码是通过学习他的网站java回答< /p>编写的。
public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
        int[] index = new int[128]; // current index of character
        // try to extend the range [i, j]
        for (int j = 0, i = 0; j < n; j++) {
            i = Math.max(index[s.charAt(j)], i);
            ans = Math.max(ans, j - i + 1);
            index[s.charAt(j)] = j + 1;
        }
        return ans;
    }
}
公共类解决方案{
public int lengthOfLongestSubstring(字符串s){
int n=s.length(),ans=0;
int[]index=new int[128];//字符的当前索引
//尝试扩大范围[i,j]
对于(int j=0,i=0;j
或者最好是
向量

vector<int> a(257,0);
向量a(257,0);

> p>不像java,C++没有为你零堆内存。

int* a = new int[257];
数组
a
中的数据是什么

在Java中,
a[0],a[1]。。。[256]
都等于零。但是在C++中,<代码> a〔0〕,a〔1〕,…[256]
包含来自该内存地址以前的任何数据的随机垃圾

您必须先将内存归零:

std::fill_n(a, 257, 0);
或者,如果您更喜欢
memset

std::memset(a, 0, sizeof(int) * 257);

编辑:正如@It'scominghome所指出的,值初始化(C++11)也是可能的:

int* a = new int[257](); // will zero the array

与java不同,C++不为你零堆内存。<代码>返回ANS + 1;<代码>看看你是否能欺骗它;)它不是未定义的行为,它只包含先前存在的内容。@Bernard读取未初始化内存是非常未定义的行为。@It's'sminghome After
int*a=new int[257]
a[0]。。。。[256]
是有效的可访问内存,但它们可能包含
int
可以保存的任何值。访问
a[s[j]]
是安全的,只是一个不确定的整数值(这可能有助于优化某些算法)。@Bernard Undefined行为不仅仅是关于安全访问。@Bernard引用ISO C++14标准声明
i=i>a[s[j]?i:a[s[j]
ub在这个wiki页面的顶部,还有
int*a=newint[257]()
std::memset(a, 0, sizeof(int) * 257);
int* a = new int[257](); // will zero the array