我是靠谱客的博主 虚拟翅膀,最近开发中收集的这篇文章主要介绍《剑指offer》面试题41:和为s的两个数字 VS 和为s的连续正数序列和为s的两个数字和为s的连续正数序列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

和为s的两个数字

题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

思路:由于是递增排序数组,所以考虑两个指针遍历,i 指针从头开始,j 指针从尾开始。如果 i 数和 j 数之和 > target,将 j 指针前移;如果小于target,将 i 指针后移。找到相等则return,找不到即(i=j-1 && [i]+[j]!=target)。

public int[] FindNumWithSum(int[] nums, int target) {
	if (nums.length == 0 || nums == null)
		return null;
	int i = 0, j = nums.length-1;
	int[] res = new int[2];
	while (i < j) {
		if (nums[i]+nums[j] < target) {
			i ++;
		} else if (nums[i]+nums[j] > target) {
			j --;
		} else {
			res[0] = nums[i];
			res[1] = nums[j];
			return res;
		}
		System.out.println(nums[i] + " " + nums[j]);
	}
	return res;
}

和为s的连续正数序列

题目二:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出三个连续序列1~5、4~6和7~8。

思路:用s指针和e指针分别标记序列的头和尾,sum用来记录当前序列的和。e指针挨个向后移动,sum+=[e],如果sum > target,s指针后移,sum-=[s],直到 <= target。

public void FindContiousSeq(int n, int target) {
	if (target == 0)
		System.out.println("0");
	int s = 1, e = 1;
	int sum = 0;
	while ((e<=n) && (s<=e)) {
		sum += e;
		while (sum > target) {
			sum -= s;
			s ++;
		}
		if (sum == target) {
			for (int i=s; i<=e; i++)
				System.out.print(i+" ");
			System.out.println("n");
		}
		e ++;
	}
}

 

最后

以上就是虚拟翅膀为你收集整理的《剑指offer》面试题41:和为s的两个数字 VS 和为s的连续正数序列和为s的两个数字和为s的连续正数序列的全部内容,希望文章能够帮你解决《剑指offer》面试题41:和为s的两个数字 VS 和为s的连续正数序列和为s的两个数字和为s的连续正数序列所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部