和为s的两个数字VS和为s的连续正数序列

题目

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




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值