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

本文介绍使用双指针法解决数组中寻找两数之和的问题,并提出一种方法来找出所有和为给定数值的连续正数序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

方法:双指针。如果和小于s,向后移;大于s,向前移。时间复杂度O(n)

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;
}

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

方法:用small和big分别标识序列的最小值和最大值。

void FindContinuousSequence(int sum){
    if (sum < 3){
        return;
    }

    int small = 1;
    int big = 2;
    int middle = (1 + sum) / 2;
    int curSum = small + big;

    while (small < middle){
        if (curSum == sum){
            PrintContinuousSequence(small, big);
        }

        while (curSum > sum && small < middle){
            curSum -= small;
            small++;

            if (curSum == sum){
                PrintContinuousSequence(small, big);
            }
        }

        big++;
        curSum += big;
    }
}

void PrintContinuousSequence(int small, int big){
    for (int i = small; i <= big; ++i){
        printf("%d ", i);
    }
    printf("\n");
}

测试用例

  • 功能测试(存在和为s的连续序列,如9、100等;不存在和为s的连续序列,如4、0)
  • 边界值测试(连续序列的最小和3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值