和为s的两个数字VS和为s的连续正数序列
2015-08-21 23:17
267 查看
题目
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使它们的和正好是s。如果有多对的和都等于s,输出任意一对即可。思路
此题思路比较正常,头指针和尾指针,结合排序的特点,有头指针指向的元素+尾指针指向的元素 > s,那么尾指针前移
头指针指向的元素+尾指针指向的元素 < s,那么头指针前移
代码
public static void getSumOftwoNumber(int[] num ,int sum) { if(num ==null && num.length<0)return ; int pa = 0; int pb = num.length-1; while(pa<pb) { if(num[pa]+num[pb] < sum) ++pa; else if(num[pa]+num[pb] > sum) --pb; else { break; //System.out.println(num[pa]+"..."+num[pb]); //这里如果不break,可以输出所有的满足条件的元素 //++pa;--pb; } } System.out.println(num[pa]+"..."+num[pb]); }
延伸
输入一个正数s,打印出所有和为s的连续正数序列(至少有两个数)。输入15,由于1+2+3+4+5=4+5+6=7+8 = 15,所以打印出1~5,4~6,7~8思路
类似于上面的那道题,我们此时要将指针放到第一个和第二个,如果之间的数据相加小于s,那么第二个指针向后移动,如果大于s,第一个指针向前移动,相当于删除第一个最小的数。我们第一个指针一直增加到 (1+s)/2即可,因为当第一个指针是s的1/2时,再加上后面的数字必然大于s,所以也就没必要再去计算。代码
public static void getSumOfListNumber(int sum) { if(sum == 0)return ; int start = 1; int end = 2; int goal=0; int mid = (sum+1)/2; goal = start + end; while(start <mid) { if(goal > sum) { goal -=start; start++; } else if(goal < sum) { end++; goal+=end; } else { for(int i=start;i<=end;i++) System.out.print(i+"..."); System.out.println(); goal -=start; start++; } } }
相关文章推荐
- 杀毒与免杀技术详解之四:特征码修改方法_简单总结
- AOJ-743-多重部分和问题
- Linux之服务器时间同步
- 异常处理
- Fiddler工具使用-抓取https请求
- OJ使用方法
- android Git使用gitignore建立项目过滤规则
- 数据结构绪论1
- Java中keytool的使用
- #ifndef... #define与#pragma once总结
- hdu1018 Big Number
- 同一个变量打印char类型和unsigned char 类型,引发的思考
- memcpy 和 memmove 函数
- CAS服务端取消https验证
- redis cluster 集群重启关闭
- 自定义控件(五)禁止滑动的ViewPager
- 新手必须知道的13个Xcode小技巧
- 鸟哥的Linux私房菜-----14、磁盘配额
- 《花千骨》为何被批“脑残”还能创造收视神话?
- 堆区和栈区的区别