Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的LeetCode753解决方案有一个神秘的错误:使用HashSet而不是Set作为对象的引用将导致StackOverFlow,为什么?_Java - Fatal编程技术网

Java 我的LeetCode753解决方案有一个神秘的错误:使用HashSet而不是Set作为对象的引用将导致StackOverFlow,为什么?

Java 我的LeetCode753解决方案有一个神秘的错误:使用HashSet而不是Set作为对象的引用将导致StackOverFlow,为什么?,java,Java,使用HashSet而不是Set作为引用将导致堆栈溢出,有人知道原因吗? 我使用了这个解决方案: 有趣的是,它的一个微小变化将导致堆栈溢出。 我编写了两个版本,唯一的区别是第一次将HashSet作为参数传递给dfs()函数,第二次将Set作为参数传递给dfs()。 这一个将堆栈溢出 public String crackSafe(int n, int k) { int total = (int)Math.pow(k, n); HashSet<String> set =

使用HashSet而不是Set作为引用将导致堆栈溢出,有人知道原因吗? 我使用了这个解决方案: 有趣的是,它的一个微小变化将导致堆栈溢出。 我编写了两个版本,唯一的区别是第一次将HashSet作为参数传递给dfs()函数,第二次将Set作为参数传递给dfs()。 这一个将堆栈溢出

public String crackSafe(int n, int k) {

    int total = (int)Math.pow(k, n);
    HashSet<String> set = new HashSet<>();
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < n; i++)
        sb.append('0');
    set.add(sb.toString());
    dfs(total, set, sb, k, n);
    return sb.toString();
}

private boolean dfs(int total, HashSet<String> set, StringBuilder sb, int k, int n){
    if(set.size() == total)
        return true;
    String prev = sb.toString().substring(sb.length() - n + 1);
    for(int i = 0; i < k; i++){
        String str = prev + i;
        if(set.contains(str))
            continue;
        set.add(str);
        sb.append(i);
        if(dfs(total, set, sb, k, n))
            return true;
        set.remove(str);
        sb.delete(sb.length() - 1, sb.length());
    }

    return false;
}

堆栈溢出的堆栈跟踪是什么?这将很容易回答这个问题。在答案中张贴完整的跟踪。再次,在问题中张贴它。评论中难以辨认。我已经把它更新到我的帖子上了,谢谢你提醒我。很有趣。尝试输入-(5,8)(4,9)(3,8)
public String crackSafe(int n, int k) {

    int total = (int)Math.pow(k, n);
    HashSet<String> set = new HashSet<>();
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < n; i++)
        sb.append('0');
    set.add(sb.toString());
    dfs(total, set, sb, k, n);
    return sb.toString();
}

private boolean dfs(int total, Set<String> set, StringBuilder sb, int k, int n){
    if(set.size() == total)
        return true;
    String prev = sb.toString().substring(sb.length() - n + 1);
    for(int i = 0; i < k; i++){
        String str = prev + i;
        if(set.contains(str))
            continue;
        set.add(str);
        sb.append(i);
        if(dfs(total, set, sb, k, n))
            return true;
        set.remove(str);
        sb.delete(sb.length() - 1, sb.length());
    }

    return false;
}