[Java基础 算法] 数组的输出格式 以及 二数之和取下标 【难度:简单】

求二数之和的 下标;

在这里插入图片描述

数组输出的方式需要为: for循环去输出打印 或者转为Json格式

第一种方法:
简单粗暴些,两重循环,遍历所有情况看相加是否等于⽬标和,如果符合直接输出。

public static void main(String[] args) {
        int numss[]={2,1,5};
        int[] twoSum = twoSum(numss, 6);
        for (int a:twoSum){
            System.out.println("第一种"+a);
        }
        System.out.println("第二种"+twoSum);
		 System.out.println("第四种"+ Arrays.toString(twoSum));


    }
    public static int[] twoSum(int[] nums, int target) {
        int []ans=new int[2];
        //下标从0开始
        for(int i = 0; i < nums.length; i++) {
        //下标从1开始
            for (int j = (i + 1); j < nums.length; j++) {
            // 依次对比   上面二个循环不同的下标 对应数组 里面不同的值   
            // 当二个下标对应的值 等于自己输入的 target总值的时候 就记录他们的  下标  
            // 通过ans 对象名数组 来存储 对应的下标  然后return 返回
                if (nums[i] + nums[j] == target) {
                    ans[0] = i;
                    ans[1] = j;
                    return ans;
                }
            }
        }
        return ans;
    }

数组正常输出的方法:

 

int[] array= {1,2,3,4,5,6};
方式一:for循环

for(int i=0;i<array.length;i++)
{
System.out.println(array[i]);
}
输出为:(自动换行格式的)

方式二:for each

for(int a:array)
System.out.println(a);
输出格式同方式一。

方式三:Arrays类中的toString方法(注意,是Arrays不是Array,Arrays类位于java.util包下)

int[] array= {1,2,3,4,5,6};
System.out.println(Arrays.toString(array));



java8的新特性   数组转list

   List<Integer> collect = Arrays.stream(twoSum).boxed().collect(Collectors.toList()); //这是List<Integer>  list<> 这里只能存储引用类型的数据 
   第二种输出
      List<Integer> collect = Arrays.stream(twoSum).boxed().collect(Collectors.toList());
        collect.forEach(integer -> {
            System.out.println(integer);
        });


第二种方法:

hash table !!!
我们可以把数组的每个元素保存为 hash 的 key,下标保存为 hash 的 value 。
这样只需判断 sub 在不在 hash 的 key ⾥就可以了,⽽此时的时间复杂度仅为 O(1)!
需要注意的地⽅是,还需判断找到的元素不是当前元素,因为题⽬⾥讲⼀个元素只能⽤⼀次。

public static int[] twoSu1(int[] nums, int target) {
        Map<Integer,Integer> map=new HashMap<>();
        //循环存储 nums 数组的下标
        for (int i=0;i<nums.length;i++){
//hash 存入了 nums数组的下标数据   所以在下面的for循环 里面有个判断 需要判断是否是当前 数据 
//sub = 总数和 减去 其中的   sub算出來的数可能 会跟 下一个for循环循环的 下标数据重复
            map.put(nums[i],i);
        }
        //第二个循环  是来循环判断
        for (int i=0;i<nums.length;i++){
        //  sub = 总数和 减去 其中的 
            int sub=target-nums[i];
            //判断是否  hash 的key   也判断不是当前的元素 
            if (map.containsKey(sub) && map.get(sub)!=i){
                return new int[]{i,map.get(sub)};
            }
        }

        throw new IllegalArgumentException("No two sum solution");
    }

方法三:
看方法⼆中,两个 for 循环,他们⻓的⼀样,我们当然可以把它合起来。复杂度上不会带来什么变化,变化
仅仅是不需要判断是不是当前元素了,因为当前元素还没有添加进 hash ⾥。

public int[] twoSum(int[] nums, int target) {
 Map<Integer,Integer> map=new HashMap<>();

 for(int i=0;i<nums.length;i++){
 int sub=target-nums[i];
 if(map.containsKey(sub)){
 return new int[]{i,map.get(sub)};
 }
 map.put(nums[i], i);
 }
 throw new IllegalArgumentException("No two sum solution");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是汤圆丫

怎么 给1分?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值