计算数组里面有多少对数之和等于指定的数,数组元素可以相等(同一个元素重复出现),配对过的index不能再次配对

13 篇文章 0 订阅
6 篇文章 0 订阅

现在把算法逻辑实现如下:
用例:
输入{1,1,99},100;返回1
输入{1,1,99,99},100;返回2
输入{5,8,1,9,10,99,2,3,98,98},100,返回2

 static int countSum(int[] items, int sum) {
        //key: item元素与sum之差,value: 差出现的次数(相当于元素出现的次数)
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        int count = 0;
        for (int i = 0; i < items.length; i++) {
            int tmp = sum - items[i];
            if (hashMap.containsKey(tmp)) {
                hashMap.replace(tmp, hashMap.get(tmp) + 1);
            } else {
                //这里所有不同元素与sum之差都会被put进来
                hashMap.put(tmp, 1);
            }
            //只有一个数时继续
            if (i == 0) {
                continue;
            }
            Integer integer = hashMap.get(items[i]);
            if ((integer) != null) {
                    //删除一对相加等于sum的两个数
                    removeOrMinus(hashMap,items[i],integer);
                    removeOrMinus(hashMap,sum - items[i],integer);
                    count++;
            }
        }
        return count;
    }


    static void removeOrMinus(HashMap<Integer, Integer> hashMap, Integer key, Integer value) {
        if (value != null) {
            if (!value.equals(1)) {
                hashMap.replace(key, value - 1);
            } else {
                hashMap.remove(key);
            }
        }
    }

该算法核心思想是先将sum与数组里面的元素差值put到hashmap里,key为差值,value为这个元素在数组中出现的次数,然后用数组中的元素值作为查询key去查询hashmap里是否存在键值对,如果存在就说明出现过与当前元素值之和等于sum的数,因为hashmap里存的是差,当前元素等于差就说明当前元素与算出这个差的数之和为sum,这样就找到了一对这样的组合,找到之后移除一个这样的组合(两个数)并count ++,移除的时候计算这对组合每个出现的次数,大于1的则减1,等于1的则删除;hashmap查询复杂度一般O(1),一个for循环时间复杂度为O(n),这样就实现了一个时间复杂度为O(n)的算法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答1: 可以使用循环语句来输入n个整数,并在循环中判断当前输入的是否为偶,如果是则累加到结果中。最后输出累加的结果即可。 示例代码: ``` n = int(input("请输入数组大小: ")) arr = [0] * n sum = 0 for i in range(n): arr[i] = int(input("请输入第 %d 个: " % (i+1))) if arr[i] % 2 == 0: sum += arr[i] print("所有偶之和为:", sum) ``` 回答2: 首先,我们需要先了解什么是一维数组。一维数组是由相同据类型的元素组成的有限序列,它们在元素的类型、个和排列方式上具有一定的限制。 我们可以使用如下代码从键盘输入n个整数存入一维数组中: ``` int n; cin >> n; int a[n]; for(int i=0; i<n; i++){ cin >> a[i]; } ``` 上述代码首先从键盘输入一个整数n,表示数组中元素的个。然后定义一个一维数组a,它的大小为n,接着通过for循环,逐个输入n个整数,并将它们存入数组a中。 接下来,我们需要计算数组元素中所有偶之和并输出。我们可以使用如下代码实现: ``` int sum = 0; // 初始化偶和为0 for(int i=0; i<n; i++){ if(a[i] % 2 == 0){ // 判断是否为偶 sum += a[i]; // 如果是偶,加入偶和中 } } cout << "偶之和为:" << sum << endl; ``` 上述代码中,我们首先定义一个变量sum,用于存储数组元素中所有偶之和,将它初始化为0。然后对数组进行遍历,利用if语句判断数组元素是否为偶。如果是偶,则将它加入偶和中。 最后,我们输出偶之和即可。 完整代码如下: ``` #include <iostream> using namespace std; int main(){ int n; cin >> n; int a[n]; for(int i=0; i<n; i++){ cin >> a[i]; } int sum = 0; for(int i=0; i<n; i++){ if(a[i] % 2 == 0){ sum += a[i]; } } cout << "偶之和为:" << sum << endl; return 0; } ``` 以上就是从键盘输入n个整数存入一维数组中,计算数组元素中所有偶之和并输出的详细解答。 回答3: 题目要求我们输入n个整数并存入一维数组中,然后计算出所有偶的和并输出。因此,我们需要用到数组和循环的知识。 首先,我们需要输入n的值,用来确定数组的长度。代码如下: ```python n = int(input("请输入数组的长度:")) ``` 接下来,我们需要定义一个数组,并将输入的n个整数存入数组中。代码如下: ```python # 定义数组 array = [] # 循环输入n个整数并存入数组中 for i in range(n): num = int(input("请输入一个整数:")) array.append(num) ``` 现在,我们已经将n个整数存入了数组中。接下来,我们需要遍历数组找出其中的偶计算它们的和。代码如下: ```python # 定义变量sum,用来存储偶的和 sum = 0 # 遍历数组 for j in array: # 判断数组中每个元素是否是偶 if j % 2 == 0: # 如果是偶,则将它加入到sum中 sum += j # 输出数组中所有偶的和 print("数组中所有偶的和为:", sum) ``` 最终的代码如下: ```python n = int(input("请输入数组的长度:")) array = [] for i in range(n): num = int(input("请输入一个整数:")) array.append(num) sum = 0 for j in array: if j % 2 == 0: sum += j print("数组中所有偶的和为:", sum) ``` 代码执行时,先输入数组的长度n,然后依次输入n个整数并存入数组中。接着,遍历数组找出其中的偶计算出它们的和,最后输出结果。 总之,这道题目考察了我们基本的数组和循环操作,梳理了这些知识点,我们可以轻松解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值