题目
输入一个递增排序的数组和一个数字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++;
}
}
}