神州信息Java笔试题(6-20)

三数之和问题-力扣15

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

  • 三层循环(不推荐)
  • 利用左右指针+二分查找
    思路
  1. Arrays.sort(nums)方法对nums数组进行从小到大排序。
  2. 一层循环,代表第一个数,放双指针left ,right,用来二分查找
  3. 去重
class Solution {
    public List<List<Integer>> threeSum(int[] nums) { 
        List<List<Integer>> list = new ArrayList();
        //必不可能
        if(nums==null || nums.length<3) return list;
        //排序
        Arrays.sort(nums);
        //循环
        for(int i=0;i<nums.length-2;i++){
        	//必不可能
            if(nums[i]>0){
                break;
            }
            //去重
            if(i-1>=0 && nums[i]==nums[i-1]) {
                continue;
            }

            int need = -nums[i];
            int left = i+1,right=nums.length-1;
            //双指针,二分查找
            while(left<right){
                int mid = nums[left]+nums[right];
                if(mid<need){
                    left++;
                }else if(mid>need){
                    right--;
                }else{
                    //刚好
                    List<Integer> curr = new ArrayList();
                    curr.add(nums[i]);
                    curr.add(nums[left++]);
                    curr.add(nums[right--]);
                    list.add(curr);
                    //去重
                    while(left<right && nums[left]==nums[left-1]){
                        left++;
                     }
                    while(right>left && nums[right]==nums[right+1]){
                        right--;
                    }
                }
            }
        }
        return list;
    }
}

小球问题

一个小球,从高为height的地方下落,下落弹地之后弹起高度为下落时的一半,如此往复,计算小球从height高度下落到第count次弹地往返的总路程,结果保证两位小数。

  • 循环法
    public static void main(String[] args) {
        //获取输入数据
        Scanner cin = new Scanner(System.in);
        int height, count;
        while(cin.hasNextInt())
        {
            height = cin.nextInt();
            count = cin.nextInt();
            System.out.println(solution(height,count));
        }
    }
    public static String solution(int height, int count){
        if(height <= 0 || count < 1){
            //错误
            System.out.println("参数错误!");
            System.exit(0);
        }
        float length = height;
        if(count == 1){
            return String.format("%.2f", length);
        }
        for(int i = 1; i < count;i++){
        	//2<<(i-1)  --->   2的(i-1)次幂
            length += 2 * height/((float)(2<<(i-1)));
        }
        return String.valueOf(String.format("%.2f", length));
    }
  • 递归法
	public static void main(String[] args) {
        //获取输入数据
        Scanner cin = new Scanner(System.in);
        int height, count;
        while(cin.hasNextInt())
        {
            height = cin.nextInt();
            count = cin.nextInt();
            System.out.println(Float.valueOf(solution(height,count))-height);
        }
    }
    public static String solution(float height, int count){
        if(height <= 0 || count < 1){
            //错误
            System.out.println("参数错误!");
            System.exit(0);
        }
        float length = height*2;
        if(count == 1){
            return String.format("%.2f", length);
        }
        length += Float.valueOf(solution( height/2,count-1));

        return String.valueOf(String.format("%.2f", length));
    }
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值