题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
例如输入数组{1,2,4,7,11,15}和数字15。由于4+11=15,因此输出4和11。

定义两个变量(指针),分别保存数组的开始元素和结尾元素,根据两变量和与目标值进行比较,改变变量的值,重复上一步的操作。
代码实现:
public class Solution{ public static boolean findNumbersWithSum(int[] data,int sum,int[] number){ boolean found=false; if(data==null||data.length<2){ return found; } int ahead=0; int behind=data.length-1; while(ahead<behind){ long curSum=data[ahead]+data[behind]; if(curSum==sum){ number[0]=data[ahead]; number[1]=data[behind]; found=true; return found; }else if(curSum>sum){ behind--; }else{ ahead++; } } return found; } public static void main(String[] args){ int[] numbers={1,2,4,7,11,15}; int[] num=new int[2]; boolean found=findNumbersWithSum(numbers,15,num); if(found){ for(int i:num){ System.out.print(i+" "); } }else{ System.out.println("not exists"); } } }
题目二:输入一个正数s,打印出所有和为s的连续正数系列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5,4~6和7~8。

考虑用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于s,那么从序列中去掉较小的值,也就是增大small的值,如果从small到big的序列的和小于s,那么可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,那么small一直增加到(1+s)/2为止。
代码实现:
public class Solution{ public static void findContinuousSequence(int sum){ if(sum<3){ return; } int small=1; int big=2; int curSum=small+big; int middle=(1+sum)/2; while(small<middle){ if(curSum==sum){ printContinuousSequence(small,big); } while(curSum>sum){ curSum-=small; small++; if(curSum==sum){ printContinuousSequence(small,big); } } big++; curSum+=big; } } public static void printContinuousSequence(int small,int big){ for(int i=small;i<=big;i++){ System.out.print(i+" "); } System.out.println(); } public static void main(String[] args){ findContinuousSequence(9); } }
posted on
浙公网安备 33010602011771号