力扣编译执行逻辑的大胆假设

力扣编译执行逻辑的大胆假设

起因

在这里插入图片描述

在力扣上面进行刷题,然后将对应的方法复制到本地IDEA中进行编写,由于需要main函数进行调试,因此将对应的全局的成员变量设置为static,这样的话IDEA中进行执行结果正确,发现在力扣执行结果反而不正确了下面是产生的差异图片。
在这里插入图片描述
在这里插入图片描述

解决

去掉对应的static即可通过
在这里插入图片描述

大胆假设

由于static是一个静态内存,同时可以进行复用,这样便猜测了一套有关力扣执行的伪逻辑
在这里插入图片描述

验证

1.先不进行提交,直接进行测试

在这里插入图片描述
==结果正确==

2. 进行提交

在这里插入图片描述
==结果错误==

3. 跳过该用例

在这里插入图片描述
res = 5 + 1 + 0 = 6

这里不符合的主要原因在于我自己直接在条件判断直接返回,导致没有对全局变量进行改变,下述代码一致。

==结果错误==

4. 继续验证

在这里插入图片描述
res = 5 + 1 + 0 + 2 = 8
==结果错误==

代码验证

    static int res = 0;

    public static int findTargetSumWays(int[] nums, int target) {
        dfs(nums, target, 0, 0);
        return res;
    }

    public static void dfs(int[] nums, int target, int temp, int depth) {
        if (depth == nums.length) {
            if (temp == target) {
                res++;
            }
            return;
        }
        dfs(nums, target, temp + nums[depth], depth + 1);
        dfs(nums, target, temp - nums[depth], depth + 1);
    }


    public static void main(String[] args) {
        Map<int[], Integer> paramMap = new LinkedHashMap<>();
        paramMap.put(new int[]{1, 1, 1, 1, 1}, 3);
        paramMap.put(new int[]{1}, 1);
        paramMap.put(new int[]{1}, 2);
        paramMap.put(new int[]{1, 0}, 1);
        paramMap.forEach((k, v) -> {
            int num = findTargetSumWays(k, v);
            for (int n : k) {
                System.out.print(n + "\t");
            }
            System.out.println("target: " + v);
            System.out.println("num: " + num);
            System.out.println("res: " + res);
            System.out.println("---------------------------------");
        });
    }

运行结果

在这里插入图片描述

这里主要是因为输入的参数采用的是K-V结构,因此这个使用了哈希数据结构。

结论

通过上述的例子可以可以证明我的伪逻辑大体上是符合逻辑的,当然这只是猜想,真正的实现逻辑我并没有真实的看到,希望大家有其他的想法,欢迎和我进行讨论。

1 个赞