题目描述:
给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面,洗牌,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差?
易错分析:
1. 注意看题目。。要存在相等的差才输出,换言之,只出现一次的差值是不输出的
解题过程:
这题可以用map来建立映射,然后用reverse_iterator 反向迭代,不但能省空间也能省时间(总比开10000个大小的数组好)。
程序:
#include <stdio.h>
#include <cmath>
#include <map>
#include <algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
int N, x;
scanf("%d", &N);
getchar();
map <int, int> m;
for (int i = 1; i <= N; i++)
{
scanf("%d", &x);
x = abs(x - i);
m[x]++; // 建立映射, x为差值, m[x]为次数
}
map <int, int>::reverse_iterator iter;
for (iter = m.rbegin();iter != m.rend(); iter++)
if (iter->second > 1) /* 题目要求输出重复的结果 */
printf("%d %d\n", iter->first, iter->second);
return 0;
}