剑指offer38--数字的和为某个数

来源:互联网 发布:茂名关键词优化 编辑:程序博客网 时间:2024/05/29 10:02

一、题目


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


二、举例



例如输入数组{1 、2 、4、7 、11 、15 }和数字15. 由于4+ 11 = 15 ,因此输出4 和11 。


三、思想



通过两个指针从两端往中间靠的方式来进行筛选,当小于指定的数时,将small++,当大于指定的数的时候,big--,当相等的时候就就可以将其打印了。


四、程序


package 剑指offer;/*题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,得它们的和正好是s。 *如果有多对数字的和等于s,输出任意一对即可。*/public class Test41 {public static void main(String args[]){int ary[] = new int[]{1, 2, 4, 7, 11, 15};findTwoNumber(ary, 15);}public static void findTwoNumber(int ary[], int number){// 边界条件判断if(ary == null && number <= 0){throw new NullPointerException("findTheArray");}// 定义两个指针,分别指向数组的开头和结尾int start = 0;int end = ary.length - 1;while((ary[start] + ary[end]) !=  number && (start < end)){if(ary[start] + ary[end] < number){start++;}else if(ary[start] + ary[end] > number){end--;}// 输出这两个数if(ary[start] + ary[end] == number){System.out.println("Number1:"+ary[start]);System.out.println("Number2:"+ary[end]);}}}}



一、题目


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


二、举例



例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打出3 个连续序列1~5、4~6 和7~8。


三、思想



  以求和为9 的所有连续序列为例,我们先把small 初始化为1, big 初始化为2。此时介于small 和big 之间的序列是{1,2},序列的和为3,小于9,所以我们下一步要让序列包含更多的数字。我们把big 增加1 变成3,此时序列为{ I, 2,坷。由于序列的和是6,仍然小于9,我们接下来再增加big 变成4,介于small 和big 之间的序列也随之变成{1, 2, 3, 4}。由于列的和10 大于9,我们要删去去序列中的一些数字, 于是我们增加small 变成2,此时得到的序列是{2, 3, 4}, 序列的和E好是9。我们找到了第一个和为9 的连续序列,把它打印出来。接下来我们再增加big,重复前面的过程,可以找到第二个和为9 的连续序列{4,5}。


四、程序


package 剑指offer;/*题目二:输入一个正数s,打印出所有和为s 的连续正数序列(至少两个数)*/public class Test42 {public static void main(String args[]){findTheArray(9);System.out.println("---------------------");findTheArray(15);}public static void findTheArray(int number){// 边界条件if(number <= 0){throw new NullPointerException("findTheArray");}int small = 1;int big = 2;// 使用的是序列从小开始逐渐扩大的方式while(sumSmallToBig(small, big) != number && small < big){if(sumSmallToBig(small, big) < number){big++;}else if(sumSmallToBig(small, big) > number){small++;}if(sumSmallToBig(small, big) == number){for(int i = small; i <= big; i++){System.out.print(i+" ");}System.out.println();big++;}}}public static int sumSmallToBig(int samll, int big){// 从small到big的连续数字进行求和int sum = 0;for(int i = samll; i <= big; i++){sum += i;}return sum;}}




1 0
原创粉丝点击