【问题描述】
从键盘输入10个整数,输出这10个数中仅出现一次的数。如果没有这样的数,则输出:None。
【输入形式】
从键盘输入10个整数。
【输出形式】
按出现的次序,输出该10个数中仅出现一次的数。如没有这样的数,则输出:None。
【样例输入】
-12 36 72 36 87 99 87 87 -12 -35
【样例输出】
72 99 -35
【样例输入】
-12 36 72 36 87 99 72 87 -12 99
【样例输出】
None
第一种做法:暴力循环
#include <iostream>
using namespace std;
const int N = 10;
int main()
{
int a[N],b[N]={0};
for(int i=0;i<N;i++) cin >> a[i];
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if(a[i]==a[j]) b[i]++;
int flag = 1;
for(int i=0;i<N;i++)
{
if(b[i]==1)
{
cout << a[i] << ' ';
flag = 0;
}
}
if(flag) cout << "None";
return 0;
}
第二种做法:我们让B数组贮存我们A数组的下标,这样我们就可以以O(n)的时间复杂度完成这道题,但这个B数组有点难实现,因为A数组中有负数,而负数不能作为数组的下标,所以我们要用到数组的偏移。
代码如下:
#include<iostream>
using namespace std;
int main() {
int num[10], count[1001] = {0};
for(int i = 0; i < 10; i++) {
cin >> num[i];
count[num[i]+500]++;
}
bool none = true;
for(int i = 0; i < 10; i++) {
if(count[num[i]+500] == 1) {
cout << num[i] << " ";
none = false;
}
}
if(none) cout << "None";
return 0;
}
在这个代码中,count[1001] = {0};是一个数组定义。这里,我们定义了一个名为count的数组,它有1001个元素,所有元素都被初始化为0。
数组的大小(1001)是根据问题的需求来确定的。在这个问题中,我们假设输入的数字在-500到500之间,所以我们需要一个大小为1001的数组来存储每个数字出现的次数。我们将数组的中心点设置为500,这样就可以处理负数的情况。例如,如果输入的数字是-500,我们就在count[0]的位置增加计数;如果输入的数字是0,我们就在count[500]的位置增加计数;如果输入的数字是500,我们就在count[1000]的位置增加计数。
这是一个很常见的技巧,被称为“偏移”,它可以帮助我们在数组中处理负数的情况。