(面试题)统计数组中数字的个数
输入:10个整数,如 9 9 0 7 8 6 5 7 3 9
输出:统计每个数字出现的次数,并按数字的大小排序
0:1
3:1
5:1
6:1
7:2
8:1
9:3
一、C++版本
#include <iostream> #include <map> using namespace std; int main() { map<int, int> m; int input[10]; int i; for (i = 0; i < 10; i++) { cin >> input[i]; m[input[i]]++; } map<int,int>::iterator m_iter; for (m_iter = m.begin(); m_iter != m.end(); m_iter++) { cout<<m_iter->first<<":"<<m_iter->second<<endl; } return 0; }
1. 用map事半功倍
2. map中自动按key值升序排序
输出:
二、C版本(忽略cin,cout)
不如C++版本用map简洁,有点绕
#include <iostream> //#include <map> using namespace std; struct MyMap{ int key; int value; }; int main() { MyMap m[10]; //需要初始化为0 memset(m, 0, sizeof(MyMap)*10); int a[10]; cout<<"输入10个整数:"; for (int i =0; i < 10; i++) { cin>>a[i]; } //k相当于依次存到m里时的结尾位置 int k = 0; //遍历输入的每个数字 for (int i = 0; i < 10; i++) { //k等于0说明m里没有数据,直接存入 if (k == 0) { //当m里存入数据时,k的值需要往后移 m[k].key = a[i]; m[k].value++; k++; }else { //k不等于0时要从0依次比较到结尾位置k,有相同的则存入相应位置,如果到结尾也没用相同的则存入最后 int flag = 0; for (int j = 0; j < k; j++) { if (m[j].key == a[i]) { m[j].value++; flag = 1; break; } } if (flag == 0){ m[k].key = a[i]; m[k].value++; k++; } } } //对结果排序 for (int i = 0; i < 10; i++) { if (m[i].value == 0) break; for (int j = i+1; j < 10; j++) { if (m[i].key > m[j].key && m[j].value != 0) { MyMap tmpMap; tmpMap = m[i]; m[i] = m[j]; m[j] = tmpMap; } } } //输出结果 for (int i = 0; i < 10; i++) { if (m[i].value == 0) break; cout<<m[i].key<<":"<<m[i].value<<endl; } return 0; }
运行结果:
(完)