注册 登录
编程论坛 JAVA论坛

代码没有输出结果,求解答

so_closely 发布于 2015-09-27 15:13, 565 次点击
这个是leetcode第15题3sum。找出三个数和为0已经解决了。
但问题是,我想在main函数中写用于测试threeSum函数的代码
即能实现通过键盘手动输入一串数用于验证,来代替在main函数中定义数组。
另外不知道如何输出threeSum中返回的List<List<Integer>> 类型的ret结果。

能解释下List<List<Integer>> 这个泛型吗,我自己最多只看到List<Integer>。谢谢


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class leetCode15 {
    List<List<Integer>> ret = new ArrayList<List<Integer>>();
   
    public void main(String[] args) {
        // TODO Auto-generated method stub
        
        int[] test1=new int[]{-1,0,1,2,-1,-4};
        
        ret=threeSum(test1);
        ret.forEach(ele -> System.out.println(ele));
        
    }
    //List<Integer>:list只能接收Integer的对象.
    public  List<List<Integer>> threeSum(int[] nums) {
        if(nums==null ||nums.length<3)
            return ret;
        
        Arrays.sort(nums);
        int len=nums.length;
        for(int i=0;i<len-2;i++){
            if(i>0 &&nums[i]==nums[i-1])
                continue;
            find(nums,nums[i],i+1,len-1);//寻找两个数和这个数加起来和为0
        }
        return ret;
    }
    public  void find(int[] nums,int target,int start,int end){
        int l=start;
        int r=end;
        while(l<r){
            if(nums[l]+nums[r]+target==0){
                List<Integer> ans = new ArrayList<Integer>();
                ans.add(target);
                ans.add(nums[l]);
                ans.add(nums[r]);
                ret.add(ans);
                while(l<r &&nums[l]==nums[l+1]) l++;//去重
                while(l<r  &&  nums[r]==nums[r-1]) r--;//去重
                l++;
                r--;
            }
            else if (nums[l]+nums[r]+target<0){            
                l++;
            }
            else
                r--;

        }
    }

}
3 回复
#2
诸葛欧阳2015-09-27 16:19
两重列表而已,一层一层的看
#3
sunfragrance2015-09-29 15:44
debug,这招很重要
#4
calix2015-09-29 17:21
程序代码:
List<List<Integer>>表示该类集合的每个元素都是List<Integer>类型的数据,List<List<List<Integer>>>就表示每个元素都是List<List<Integer>>类型的。。。以此类推,不过一般不会用这么复杂的类型
main方法是static的,所以在main方法中不能直接调用非static方法和属性,解决办法:将要调用的属性和方法也改成static或new一个对象进行调用
ret.forEach(ele -> System.out.println(ele));//java中forEach不是这样写的
下面代码仅供参考

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class leetCode15 {
    static List<List<Integer>> ret = new ArrayList<List<Integer>>();
    public static void main(String[] args) {
        int[] test1=new int[]{-1,0,1,2,-1,-4};
        ret=threeSum(test1);
        for(List<Integer> ele : ret){
            System.out.println(ele);
        }
    }
    //List<Integer>:list只能接收Integer的对象.
    public static List<List<Integer>> threeSum(int[] nums) {
        if(nums==null ||nums.length<3)
            return ret;
      

        Arrays.sort(nums);
        int len=nums.length;
        for(int i=0;i<len-2;i++){
            if(i>0 &&nums[i]==nums[i-1])
                continue;
            find(nums,nums[i],i+1,len-1);//寻找两个数和这个数加起来和为0
        }
        return ret;
    }
    public static void find(int[] nums,int target,int start,int end){
        int l=start;
        int r=end;
        while(l<r){
            if(nums[l]+nums[r]+target==0){
                List<Integer> ans = new ArrayList<Integer>();
                ans.add(target);
                ans.add(nums[l]);
                ans.add(nums[r]);
                ret.add(ans);
                while(l<r &&nums[l]==nums[l+1]) l++;//去重
                while(l<r  &&  nums[r]==nums[r-1]) r--;//去重
                l++;
                r--;
            }
            else if (nums[l]+nums[r]+target<0){           

                l++;
            }
            else
                r--;
        }
    }
}



[ 本帖最后由 calix 于 2015-9-29 17:25 编辑 ]
1