【问题描述】 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。 【输入形式】 输入的第一行包含一个整数n,表示给定整数的个数。 第二行包含所给定的n个整数。 【输出形式】 输出一个整数,表示值正好相差1的数对的个数。小数在前,大数在后,如有多组输出顺序按照第一个数字递增排序,重复数字只显示一组。
时间: 2023-05-27 21:06:09 浏览: 113
【样例输入】 5 1 2 3 5 6 【样例输出】 4 【样例说明】 此时符合要求的数对有(1,2),(2,3),(5,6),(3,2) 【数据说明】 1≤n≤1000,给定的整数均不超过10000。
相关问题
【问题描述】 给定n个的整数,问这些数中有多少对整数,它们的值正好相差1。 【输入形式】 输入的第一行包含一个整数n,表示给定整数的个数。 第二行包含所给定的n个整数。
【样例输入】
5
1 5 2 4 3
【样例输出】
4
【样例说明】
1和2,2和3,3和4,4和5这四对数的值正好相差1。
【解题思路】
可以先将输入的n个整数排序,然后从第一个整数开始遍历,对于每个整数,查找其后面的每个整数,如果这两个整数的差值为1,则将计数器加1。遍历完所有整数后,计数器中的值即为所求。
【参考代码】
【问题描述】 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。 【输入形式】 输入的第一行包含一个整数n,表示给定整数的个数。 第二行包含所给定的n个整数。 【输出形式】 输出一个整数,表示值正好相差1的数对的个数。用C或C++语言
这是一个经典的算法题目,通常可以使用哈希表(unordered_set 或 map)来解决。以下是基本思路:
1. 首先,读取整数的数量 `n` 和所有的整数。
2. 创建一个哈希表,用于存储每个遇到的整数及其出现次数。
3. 对于每个整数 `num`,检查它是否已经在哈希表中,如果存在,则找到之前的那个整数(`num - 1`),计算并更新两者之间的差为1的数对数量。注意,如果 `num` 等于1,那么 `num - 1` 就不存在了,所以我们直接增加 `num` 的计数。
4. 同时,更新 `num` 的计数,因为可能还有其他整数与 `num + 1` 差1。
5. 最后,遍历哈希表,统计所有整数与其前一个(或后一个,取决于哈希表中键的顺序)的差为1的数对。
以下是简单的C++代码示例:
```cpp
#include <iostream>
#include <unordered_map>
int count_pairs(int arr[], int n) {
std::unordered_map<int, int> freq;
for (int i = 0; i < n; ++i) {
if (freq.find(arr[i] - 1) != freq.end()) {
freq[arr[i]] += freq[arr[i] - 1];
}
freq[arr[i]]++;
}
return freq[0] + freq[n - 1]; // 如果数组的第一个元素是0,需要加上额外的一对(0, 1)
}
int main() {
int n;
std::cin >> n;
int arr[n];
for (int i = 0; i < n; ++i) {
std::cin >> arr[i];
}
std::cout << count_pairs(arr, n) << std::endl;
return 0;
}
```
阅读全文