和为s的两个数字

// 面试题57(一):和为s的两个数字
    // 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们
    // 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
    static bool get_sum_nums(std::vector<int>& arr, int sum, int& num1, int& num2)
    {
        if(arr.size()<2)
        {
            return false;
        }

        uint32_t start = 0;
        uint32_t end = arr.size() - 1;
        while(end > start)
        {
            long long temp = arr[start] + arr[end];
            if(temp == sum)
            {
                num1 = arr[start];
                num2 = arr[end];
                return true;
            }
            else if(temp > sum)
            {
                end--;
            }
            else
            {
                start++;
            }
        }

        return false;
    }

    // 面试题57(二):和为s的连续正数序列
    // 题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。
    // 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。
    static void find_sequence(uint32_t sum, std::vector<std::vector<uint32_t>>& matrix)
    {
        uint32_t small = 1;
        uint32_t big = 2;
        uint32_t middle = (1 + sum) / 2;
        uint32_t temp = small + big;
        while(big <= middle)
        {
            if(temp == sum)
            {
                _add(small, big, matrix);
            }

            if (temp > sum && small < big)
            {
                temp -= small;
                small ++;
            }
            else
            {
                big++;
                temp += big;
            }
        }

        for(auto& a:matrix)
        {
            for(auto& i:a)
            {
                printf("%d\t", i);
            }
            printf("\n");
        }
    }

    static void _add(uint32_t small, uint32_t big, std::vector<std::vector<uint32_t>>& arr)
    {
        std::vector<uint32_t> tmp;
        for(auto i = small; i <= big; ++ i)
        {
            tmp.push_back(i);
        }

        arr.push_back(tmp);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值