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

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

思路:最初我们找到数组的第一个数字和最后一个数字。首先定义两个指针,第一个指针指向数组的第一个(也就是最小的)数字,第二个指针指向数组的最后一个(也就是最大的)数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。

#include "stdafx.h"
#include<iostream>

bool FindNumbersWithSum(int data[], int length, int sum, int* num1, int* num2)
{
    bool found = false;
    if(length < 1 || num1 == NULL || num2 == NULL)
        return found;

    int ahead = length -1;
    int behind = 0;

    while(ahead > behind)
    {
        long long curSum = data[ahead] + data[behind];

        if(curSum == sum)
        {
            *num1 = data[behind];
            *num2 = data[ahead];
            found = true;
            break;
        }
        else if(curSum > sum)
            ahead --;
        else
            behind ++;
    }

    return found;
}

int main()
{
    int data[] = {1,2,4,7,11,15};
    int length = sizeof(data)/sizeof(int);
    int sum = 15;
    int num1, num2;
    int result = FindNumbersWithSum(data, length, sum, &num1, &num2);
    if(result)
    {
        if(num1 + num2 == sum)
            printf("%d  %d\n", num1, num2);
        else
        printf("Failed.\n");
    }
    else
        printf("Failed.\n");

    return 0;
}

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

思路:

两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2.如果从small到big的序列的和大于S,可以从序列中去掉较小的值,也就是增大small的值。如果从small到big的序列的和小于S,可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small到(1+S)/2为止。

 1 #include "stdafx.h"
 2
 3 void PrintContinuousSequence(int small, int big);
 4
 5 void FindContinuousSequence(int sum)
 6 {
 7     if(sum < 3)
 8         return;
 9
10     int small = 1;
11     int big = 2;
12     int middle = (1 + sum) / 2;
13     int curSum = small + big;
14
15     while(small < middle)
16     {
17         if(curSum == sum)
18             PrintContinuousSequence(small, big);
19
20         while(curSum > sum && small < middle)
21         {
22             curSum -= small;
23             small ++;
24
25             if(curSum == sum)
26                 PrintContinuousSequence(small, big);
27         }
28
29         big ++;
30         curSum += big;
31     }
32 }
33
34 void PrintContinuousSequence(int small, int big)
35 {
36     for(int i = small; i <= big ; i ++)
37         printf("%d ", i);
38
39     printf("\n");
40 }
41
42 int main(int argc, char const *argv[])
43 {
44     int sum = 9;
45     printf("test for %d:\n", sum);
46     FindContinuousSequence(sum);
47
48     sum = 15;
49     printf("test for %d:\n", sum);
50     FindContinuousSequence(sum);
51
52     sum = 100;
53     printf("test for %d:\n", sum);
54     FindContinuousSequence(sum);
55
56     return 0;
57 }

时间: 2024-12-27 08:16:16

和为S的两个数字VS和为S的连续正数序列的相关文章

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the s

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

题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,则输出任意一对即可. 分析:选择数组的两端,将其相加,然后与s比较,如果比s大,则将指向数组最后的向前移一位,如果小于s,则指向数组的第一位的向后移一位,然后继续这个过程.如果等于s,则输出这两个数. 实现: bool FindNumbersWithSum(int data[],int length,int sum,int* num1,int* num2) {     bool fou

剑指Offer面试题41(Java版):和为s的两个数字VS和为s的连续正数序列

题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多个数字的和等于s,输出任意一对即可. 例如输入数组{1,2,4,7,11,15}和数字15.由于4+11=15,因此输出4和11. 在面试的时候,很重要的一点是应聘者要表现出很快的反应能力.只要想到一个办法,应聘者就可以立马告诉面试官,即使这个办法不一定是最好的.比如这个问题,很多人会立即能想到O(n2)的方法,也就是先在数组中固定一个数字,再依次判断数组中其余n-1个数字与它的和是不是等于s.面试官会

递增数列中和为s的两个数字,和为s的连续正数序列

1 和为s的两个数,利用begin,end两个位置标志和为s前后两个元素,当和大于s,end前移,和小于s,begin后移 vector<int> FindNumbersWithSum(vector<int> array,int sum) { 2 vector<int>res; 3 if(array.size()==0) 4 return res; 5 bool found=false; 6 int cursum=0; 7 int begin=0; 8 int end=

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

bool FindNumbersWithSum(int data[], int length, int sum, int* num1, int* num2) { bool found = false; if (length < 1 || num1 == NULL || num2 == NULL) return found; int ahead = length - 1; int behind = 0; while (ahead > behind) { long long curSum = da

和为S的连续正数序列(剑指offer) 两个个指针的应用

和为S的连续正数序列 参与人数:1005时间限制:1秒空间限制:32768K 通过比例:26.06% 最佳记录:0 ms|0K(来自  平方宁) 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22.现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

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

其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧.时间复杂度肯定就是 O(n2)啰.但是这题目肯定不会这么简单,否则就是小学生的水平了嘛. 其实我刚到这题的时候想到的是用二叉查找的方法进行.但是可能有点困难. 书上提供的方法固然是很巧妙的. 我们要抓住题目中数组的特点,是排好序的. 我们先定义两个指针.一个指头,一个指尾. 我们来计算start+end=16>15.于是知大了,咋办? 我们将end往后移一位.也就是如下了: 些时 1+11=12<15..咋办? 肯定是将

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

import java.util.*; public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { if(sum < 0){ return null; } ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>()

[程序猿面试题精选100题]10.排序数组中和为给定值的两个数字

剑指Offer之和为S的两个数字 剑指Offer之和为S的连续正数序列 扩展(1):输入一个数组,推断这个数组中是不是存在三个数字i, j, k,满足i+j+k等于0. 扩展(2):假设输入的数组是没有排序的,但知道里面数字的范围,其它条件不变,怎样在O(n)时间里找到这两个数字?这个的基本思路是先用哈希表实现O(n)的排序(请參照本面试题系列的第57题).接下来的步骤都一样了.