您的位置:首页 > Web前端

《剑指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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: