【问题标题】:Two sum return statement returns nothing两个 sum return 语句不返回任何内容
【发布时间】:2021-07-23 05:26:26
【问题描述】:

我正在尝试解决一个问题,即我必须在数组中添加两个元素以等于目标整数值。我认为我的代码是正确的,并且会返回所需的目标,但是 return 语句没有返回任何值。为什么会这样,我该如何解决?

谢谢

public static void main(String[] args) {
    int[] nums= {2,7,11,15};
    int target= 9;
    
}
    public int twoSum(int[] nums, int target) {
        int result=0; 
        for(int i = 0; i<nums.length ;i++){
            for(int j=i+1; j<nums.length ;j++ ){
                result = nums[i] + nums[j];
                if (result == target){
                  return result;
                }else{
                    break;
                }
            }
        }
    
        
        
    }
}

【问题讨论】:

  • 内部循环(j 之上的循环)永远不会执行超过一次的迭代:要么返回,要么中断。如果这确实是您想要的,您可以删除循环。
  • 如果result 等于target,则返回似乎不是特别有用:你知道它的值是什么,它与target 相同。相反,将返回类型设为boolean,这样如果找到(在循环内)就可以返回true;如果不是(在循环之后),则为 false。
  • 这甚至不应该编译,因为如果你从不进入循环,你就没有返回。
  • 如果方法已编译(在方法末尾缺少return),该方法仍然不会返回任何内容,因为永远不会调用该方法

标签: java for-loop return conditional-statements


【解决方案1】:

break 使用错误。另外,您必须return result。我不确定这段代码是否可以编译。是吗?你也必须调用方法twoSum(...)。我看到您的数组已排序,这意味着您实际上可以使用两个指针在O(n) 时间内解决问题:leftright,如下所示:

import java.util.Arrays;

class Solution {
    
    // O(n) time, O(1) space
    private static boolean twoNumberSum(int[] array, int sum) {
        if (array.length < 2) {
            return false;
        }
        int left_idx = 0;
        int right_idx = array.length - 1;
        
        // O(n) time, O(1) space
        while (left_idx < right_idx) {
            int currentSum = array[left_idx] + array[right_idx]; 
            if (currentSum < sum) {
                left_idx++;
            }
            else if (currentSum > sum) {
                right_idx--;
            }
            else {
                return true;
            }
        }
        return false;
    }

    public static void main(String ...args) {
        int[] array = {2, 7, 11, 15};
        int valid_sum = 9;
        int invalid_sum = 10;
        
        System.out.format("(%s, %d) -> %b\n", Arrays.toString(array), valid_sum, Solution.twoNumberSum(array, valid_sum));
        System.out.format("(%s, %d) -> %b\n", Arrays.toString(array), invalid_sum, Solution.twoNumberSum(array, invalid_sum));
    }
}

另一个对未排序数组有用的解决方案是使用哈希集 -> O(n) 时间,O(n) 空间。

【讨论】:

  • 感谢您的帮助。我现在尝试蛮力。一旦我得到这个当前的代码,我将尝试一种更有效的方法:)