暴力破解 twosum 算法

Posted

技术标签:

【中文标题】暴力破解 twosum 算法【英文标题】:Brute forcing the twosum algorithm 【发布时间】:2017-07-04 23:29:21 【问题描述】:

二和问题是:

给定 nums = [2, 7, 11, 15],target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]。

我正在学习 java 并且遇到了一些 leetcode 问题。在我编写代码以提高效率之前,我试图想出一个蛮力解决方案,但我的代码似乎无法编译:

public class TwoSum 

//static int[] arraynums = new int[]2, 7, 11, 15;
//static int target = 9;

//public static void main(String args[])
//
    //TwoSum name = new TwoSum();
    //name.twoSums(arraynums, target);
//
    public int twoSums(int[] nums, int target) 
    
        int sum = 0;

        for (int i = 0; i < nums.length; i++)
        
            for (int j = 0; j < nums.length; j++)
               
                sum = nums[i] + nums[j];
                if (sum == target)
                
                    System.out.println(i + " " + j);
                    return new int[] i,j;
                

            
        
        return new int[] ;
    

我知道我需要一个 return 语句,但我不确定我应该返回什么,我也不确定是否需要我的 main 方法。

【问题讨论】:

当您编写public int[] twoSum(... 时,您是在说您的方法 twoSum(...) 将返回一个 int 元素数组。看来您想做其他事情。检查您的方法定义基础知识。 【参考方案1】:

@Alfabravo 是对的。您需要返回一个整数数组。如果你不想退货。只需使用

 public void twoSum(int[] nums, int target)

【讨论】:

它也会以这种方式运行。同样在 main 方法中,只需像这样实例化类。 TwoSum name = new TwoSum(); name.twoSum("arraynums", "target");【参考方案2】:

你在正确的轨道上!

关于添加return 语句,只需在 println 语句之后添加即可。

...
System.out.println(i + " " + j);
return new int[] i,j;
...

尽管您需要检查ij 是否不相等,因为如果它们相等,它们将指向nums 中的相同数字。 除非这不是问题的要求。如果是,您可以添加类似

的内容
if (sum == target && i != j)

祝你好运。

【讨论】:

当我添加这个 return 语句时,我仍然得到一个错误,我缺少一个 return 语句:( 它是因为并非所有代码路径都返回一个值。在函数的最后添加return false,它应该可以工作。 嗯TwoSum.java:19:错误:不兼容的类型:意外的返回值返回新的int [] i,j; ^ TwoSum.java:24:错误:不兼容的类型:意外的返回值返回 false; ^ 对不起不是return false(我在想什么)你应该返回指定的返回类型,在你的情况下是int数组 - 这将是`return new int[] ; (一个空数组,因为没有两个和。 我知道你要去哪里,但仍然出现错误 TwoSum.java:23: error: incompatible types: unexpected return value return new int[] i,j; ^ TwoSum.java:28: 错误:不兼容的类型:意外的返回值 return new int[] ; ^【参考方案3】:

对于 leetCode,您只需完成代码,无需添加 main 函数。

对于您的 twoSum 方法,您需要返回一个 int 类型的 array,其中包含元素的索引。

你可以这样测试:

    public static void main(String args[]) 
    int[] testData = 2, 7, 11, 15;
    int target = 9;
    TwoSum ts = new TwoSum();
    int[] result = ts.twoSum(testData, target);
    for (int i = 0; i < result.length; i++) 
        System.out.println(result[i]);
    

【讨论】:

我自己也是这样做的(这样我才能完全理解 Java 是如何使用的) 是的,打印出来非常有用,这样您就可以检查您的逻辑。【参考方案4】:
public class Solution 
    public int[] twoSum(int[] num, int target) 
    // Take an array and the target number as parameter
    // Initialize the variables
        int length = num.length;
        int index1 = 0;
        int index2 = 0;
        int i;
        int j;
        for (i=0; i<length; i++) 
        // First loop, i starts at num[0] which is the first element in array
            for (j=i+1; j<length; j++)
            // Second loop, j starts at num[1], the second element
                if (num[i] + num[j] == target)
                // If they are equal return the index
                    index1 = i;
                    index2 = j;
                
            
        
        // The result should be an array contains 2 indices
        int[] result = new int[] index1, index2;
        return result;
    

遍历每个元素 x 并查找是否有另一个值等于 target-x。

【讨论】:

能否请您描述一下代码的工作原理

以上是关于暴力破解 twosum 算法的主要内容,如果未能解决你的问题,请参考以下文章

破解aes密码

archpr 压缩文件暴力破解

算法五 递归方式实现暴力破解

决策树算法检测telnet暴力破解

算法六 暴力破解递归到动态规划

暴力破解与验证码安全