剑指Offer-41

xiaoxiao2021-02-28  102

题目1:

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得它们的和正好是S,如果有多对,输出任意一对即可。

题目2:

输入一个整数s,打印出所有和为s的连续整数序列。(至少两个数)

实现

public class Solution41 { public static void findNums1(int[] nums,int s){ if(nums==null || nums.length<2){ return; } Map<Integer,Integer> dic = new HashMap<Integer,Integer>(); for(int i=0;i<nums.length;i++){ if(dic.containsKey(nums[i])){ dic.put(nums[i],2); } else{ dic.put(nums[i],1); } } for(int i=0;i<nums.length;i++){ int diff = s-nums[i]; if(dic.containsKey(diff)){ if(diff==nums[i]){ if(dic.get(diff)==2){ System.out.printf("满足要求的数:%d,%d",diff,nums[i]); } } else{ System.out.printf("满足要求的数:%d,%d",diff,nums[i]); } } } } public static void findNums2(int[] nums,int s){ if(nums==null || nums.length<2){ return; } int start=0; int end=nums.length-1; while (start<end){ int sum = nums[start]+nums[end]; if(sum==s){ System.out.printf("满足要求的数:%d,%d",nums[start],nums[end]); return; } else if(sum>s){ end--; } else { start++; } } System.out.printf("没有满足要求的数"); } public static void findContinuousSequence(int sum){ if(sum<3){ return; } int small =1; int big=2; int cur_sum = small+big; int middle = (1+sum)/2; while (small<middle){ if(cur_sum==sum){ printNums(small,big); } while (cur_sum>sum && small<middle){ cur_sum-=small; small++; if(cur_sum==sum){ printNums(small,big); } } big++; cur_sum+=big; } } public static void printNums(int start,int end){ for(int i=start;i<=end;i++){ System.out.format(" %d",i); } System.out.println(); } public static void main(String[] args){ findContinuousSequence(15); } }
转载请注明原文地址: https://www.6miu.com/read-21805.html

最新回复(0)