剑心互娱23春招笔试第二题

文章介绍了如何解决一个编程笔试题,即在给定数组中找出所有大小对(a[i]<a[k]且a[k]之后的元素均小于a[k])并计算它们的和。通过双重循环和标志变量实现,最后给出了一段C++代码示例和测试案例。
摘要由CSDN通过智能技术生成

最近做了剑心互娱23届春招笔试的第二题,当时没有写出来。下来后想了想代码,于此记录。

题目:求所有大小对之和

题目:(大概是)有一个长度为n的数组a。若假设i<k,a[i]<a[k],并且在数组中a[k]之后的元素都小于a[k].则称a[i]+a[k]为一个大小对。试求出数组a中所有大小对之和。(尽量使用更为高效的算法。)

思路:首先用双重循环找到数组中可能存在的a[k],可以用这个条件找到:满足a[k]之后的元素都要小于a[k]。

代码及详细注释如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long CalcTotal(vector<int>& a) {
    long long sum = 0L;//最后所有大小对之和
    int g = 0;//记录每个大小对中的a[k]位置的数组下标
    int flag = 1;//用做判断
    for (int i = 0; i < a.size(); i++) {//双重循环寻找可能的a[k]位置
        int m = a[i];
        for (int j = i + 1; j < a.size(); j++) {
            if (m < a[j]) { //若是发现在数组中m的后面还有元素比m小,即不是我们要寻找的a[k],将flag置0,退出本次循环。
                flag = 0;
                break;
            }
        }
        if (flag == 1) {//若是flag依然为1,则表明本次外层循环的m是我们要找的a[k]
            g = i;//记录a[k]的位置即为i
            for (int k = 0; k < g; k++) {
                if (a[k] < a[g]) {
                    long long count = a[g] + a[k];//循环累加统计sum即大小对之和
                    sum += count;
                }
            }
        }
        flag = 1;  //将flag重置为1,防止下一次循环出现错误
    }

    if (g == 0) { //即sum=0,数组中没有不存在大小对
        return sum;
    }
    return sum;
}

int main() {
    vector<int>p;
    int n;
    int i = 0;
    cin >> n;//输入元素个数
    int m;
    for (int i = 0; i < n; i++) {
        cin >> m;
        p.push_back(m);
    }
    long long s = CalcTotal(p);
    cout << s;

}

测试:

输入: n=6

vector<int>p={1,7,3,5,4,3}

输出:

38

欢迎指正~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值