《剑指offer》编程题java实现(二十四):和为s的数字
2018-03-15 16:06
411 查看
和为s的数字(一) 和为s的两个数字
问题描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路分析
分析题目,递增数组,找两个值之和为s,那么可以设置两个指针,分别指向数组的首位,记录和为numSum,如何numSum>s,尾部指针前移,numSum
代码展示
package com.offer; import java.util.ArrayList; public class FindNumbersWithSum { public ArrayList<Integer> FindNumbersWithSumSolution(int[] array, int sum) { ArrayList<Integer> arrayList=new ArrayList<>(2); if (array==null||array.length<=0) { return arrayList; } int n=array.length; int i=0;//头指针 int j=n-1;//尾指针 int num=0; while(i<j) { num=array[i]+array[j]; if (num==sum) { break; }else if (num>sum) { j--; }else { i++; } } if (num==sum) { arrayList.add(array[i]); arrayList.add(array[j]); } return arrayList; } public static void main(String[] args) { FindNumbersWithSum findNumbersWithSum=new FindNumbersWithSum(); int [] array= {1,3,5,7,9}; ArrayList<Integer> arraylist = findNumbersWithSum.FindNumbersWithSumSolution(array, 11); for (Integer integer : arraylist) { System.out.println(integer); } } }
和为s的数字(二) 和为s的连续正数序列
问题描述输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路分析
此题为上一道题的变种,依然是两个指针,只不过起始状态,头指针指向1,尾指针指向2,计算两个指针之间的和(包括这两个指针),然后比较,把所有符合的保存起来即可,临界条件是头指针<(s+1)/2
代码展示
package com.offer; import java.util.ArrayList; public class FindContinuousSequenceSolution { public ArrayList<ArrayList<Integer>> arrayListAll=new ArrayList<>(); public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) { int small=1; int big=2;//至少包含两个数,所以big为2 int middle=(sum+1)/2;//设置边界条件,small不能大于middle int numSum=big+small; while(small<middle) { if (numSum==sum) { addToArraylist(small,big); big++; numSum+=big; } if (numSum<sum) { big++; numSum+=big; }else { numSum-=small; small++; } } return arrayListAll; } private void addToArraylist(int small, int big) { ArrayList<Integer> arrayList=new ArrayList<>(); for(int i=small;i<=big;i++) { arrayList.add(i); } arrayListAll.add(arrayList); } public static void main(String[] args) { FindContinuousSequenceSolution findContinuousSequenceSolution=new FindContinuousSequenceSolution(); ArrayList<ArrayList<Integer>> arr = findContinuousSequenceSolution.FindContinuousSequence(4); for (ArrayList<Integer> arrayList:arr) { for (Integer m:arrayList) { System.out.print(m); } System.out.println(); } } }
相关文章推荐
- 《剑指offer》编程题java实现(十):数组中出现次数超过一半的数字
- 《剑指offer》编程题java实现(十一):数组中只出现一次的两个数字
- 《剑指offer》编程题java实现(二十三):数组中唯一只出现一次的数字
- 剑指Offer——编程题的Java实现(更新完毕……)
- 《剑指offer》编程题java实现(五):链表中倒数第k个字节
- 《剑指offer》编程题java实现(三):从尾到头打印链表
- 《剑指offer》编程题java实现(九):数组中逆序对的数目
- JAVA实现旋转数组的最小数字问题(《剑指offer》)
- 剑指offer编程题Java实现——面试题6重建二叉树
- 《剑指offer》编程题java实现(十三):反转链表
- 《剑指offer》编程题java实现(十七):合并两个排序的链表
- 《剑指offer》编程题java实现(七):丑数问题
- 《剑指offer》编程题java实现(十八):删除链表的结点
- 剑指Offer——编程题的Java实现
- 《剑指offer》编程题java实现(十四):二进制中1的个数
- 《剑指Offer》java实现 数组中出现数字超过1半的数字
- 《剑指offer》编程题java实现(二):替换空格
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
- 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前
- 《剑指offer》编程题java实现(十二):连续子数组的最大和