# 数字出现次数和map的应用

334人阅读 评论(0)

//大家都用的异或，其实最简单的还是用哈希表 map

1、

#include<iostream>
#include<vector>
#include<map>
#include<unordered_map>
#include <algorithm>
using namespace std;
void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
unordered_map<int, int>  hash;
//map<int, int>  hash;
//vector<int> hash={0}; //不可以
// int hash[655] = {0};
for (int i = 0; i < data.size(); i++)
hash[data[i]]++;//可以
vector<int>v;
for (int i = 0; i < data.size(); i++)
if (hash[data[i]] == 1)
v.push_back(data[i]);
*num1 = v[0]; *num2 = v[1];
cout << *num1 << " " << *num2 << endl;
}
int main()

{
vector<int> data = { 0,2, 1, 3, 2, 3, 5 };
int* p1=new int();
int*  p2 = new int();
FindNumsAppearOnce(data, p1, p2);

return 0;
}

2、

class Solution {
public:
void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
unordered_map<int, int> map;
for (int i = 0; i < data.size(); i++)
map[data[i]]++;
vector<int>v;
for (int i = 0; i < data.size(); i++)
if (map[data[i]]== 1)
v.push_back(data[i]);
*num1 = v[0]; *num2 = v[1];
}

};

## 题目描述

• 参与人数：4565时间限制：1秒

## 题目描述

class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
map<int,int> map;
for(int i=0;i<data.size();i++)
map[data[i]]++;
return map[k];
}
};
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
auto p = equal_range(data.begin(),data.end(),k);
return p.second - p.first;
}
};

class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int count=0;
for(int i=0;i<data.size();i++){
if(data[i]==k)
count++;
}
return count;

}
};

public:
int GetNumberOfK(vector<int> data ,int k) {
//单纯的利用了count函数。。。。。
return count(data.begin(),data.end(),k);

}
};
 classSolution { public:     intFirstNotRepeatingChar(string str) {         if(str.length()==0)             return-1;         inthash[256]={0};         inti=0;         while(str[i]!='\0'){             hash[str[i]]++;             ++i;         }         i=0;         while(str[i]!='\0'){             if(1==hash[str[i]]){                 returni;             }             i++;         }         return-1;     } };  
 classSolution { public:     intFirstNotRepeatingChar(string str) {         map<char,int>mp;         if(str.size()==0)             return-1;         for(int`i=0;i

#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
void plpx(vector<int> data) {
int ver[65535],k=0;
//vector<int> ver;
vector<int> ver1;
//int hash[65535] ;
//int b[65535] ;

for (int i = 0; i < data.size(); i++)
{
//ver.push_back(-1);
ver[data[i]]++;

}

for (int i = 1; i < data.size(); i++)//直接从1开始
{
int n = 0;
for (int j = 0; j < i; j++)

if (ver[i] != ver[j])
{
n++;
if (n == i)
{
k++;
//n = 0;
int p = n;
}
}
}

for (int i = 0; i < k; i++)
{
//ver.push_back(-1);
ver1.push_back(ver[i]);

}

//ver1 = ver;

int i, j, temp;
for (i = 0; i<k; i++)
for (j = i; j<k; j++)
if (ver[i]<ver[j])
{
temp = ver[i];
ver[i] = ver[j];
ver[j] = temp;
}

for (i = 0; i<k; i++)
{
for (j = 0; j<k; j++) //10为数组长度
if (ver1[j] == ver[i]) //temp为要查找的元素
break;
cout <<j;
}

cout << endl;

}//从大到小

int main()
{
vector<int > arr= { 10, 1, 4, 4, 3, 3, 3, 2, 2, 5, 5, 5, 5, 6, 6, 6, 8, 7, 9 };
plpx(arr);
system("pause");
return 0;
}

//排序版
#include <stdio.h> //二分查找 也叫折半查找

int find(int arr[], int left, int right, int data);

int main()
{

int arr[] = { 45,0,0,0,1, 2, 3, 4,4, 4, 4, 4, 5,9877 };
int hash[65535] = {0};
int hash1[65535] = { 0 };
int b[65535];
int t=0;
int cout = 0;
int len = sizeof(arr) / sizeof(arr[0]);
//printf("目标元素所在的下标是：%d\n", find(arr, 0, len-1, 4)); //3
for (int i = 0; i < len; i++)
{
hash[arr[i]]++;
}
for (int i = 0; i < 65535;i++)
if (hash[i] != 0)
{
printf("%d出现%d次\n",i, hash[i]);
cout++;
}

printf("共有%d个独立数\n",  cout);
return 0;
}
//output
0出现3次
1出现1次
2出现1次
3出现1次
4出现5次
5出现1次
45出现1次
9877出现1次

//原序版 按原顺序输出  方法1 简单
#include<stdio.h>
int main()
{

int arr[] = { 1234,1234,1234,1234,1234,1234,1234,45, 45, 45, 45,  0, 0, 0, 0, 0, 45,
3, 1, 2, 4, 4, 4, 4, 4, 1234, 5, 9877 };
int hash[65535] = { 0 };
int hash1[65535] = { 0 };
int t = 0;
int len = sizeof(arr) / sizeof(arr[0]);
//printf("目标元素所在的下标是：%d\n", find(arr, 0, len-1, 4)); //3
for (int i = 0; i <len; i++)
{
hash[arr[i]]++;
}
int max = -1;
for (int i = 0; i < len; i++)
//if (max < hash[arr[i]])
//{
// max = hash[arr[i]]; //还是按原来顺序列出的
// t = arr[i];
//}
{
hash1[arr[i]]++;
if (hash1[arr[i]]>1)
continue;
printf("%d, %d\n", arr[i], hash[arr[i]]);

}

//printf("%d最大次数是%d\n", t, max);
return 0;
}

//输出
1234, 8
45, 5
0, 5
3, 1
1, 1
2, 1
4, 5
5, 1
9877, 1

//原序版 按原顺序输出  方法2
#include <stdio.h>

int main()
{

int arr[] = { 1234,45, 0, 0, 0,45, 1, 2, 3, 4, 4, 4, 4, 4,1234, 5, 9877 };
int hash[65535] = { 0 };
int hash1[65535] = { 0 };
int b[65535] ;
int t = 0,flag=0;
int cout = 0;
int len = sizeof(arr) / sizeof(arr[0]);
//printf("目标元素所在的下标是：%d\n", find(arr, 0, len-1, 4)); //3
for (int i = 0; i < len; i++)
{
hash[arr[i]]++;
if (arr[i] != arr[i + 1])  //更改
{
//hash[t] = hash1[arr[i]];
b[t++] = arr[i];

}

}
for (int i = 0; i < t; i++) //小于t 不要再小于65535因为其余部分的数据还未初始化
//会使得b[i]得到很大的随机数 大于65535而使得hash数组越界
//if (hash[b[i]] != 0)//把0次的过滤掉

{
hash1[b[i]]++;
if (hash1[b[i]]>1)
continue;

printf("%d出现%d次\n", b[i], hash[b[i]]);
cout++;

}
//printf("共有%d个独立数\n", b[65534]);//-858993460
printf("共有%d个独立数\n", cout);
return 0;
}
//output
1234出现2次
45出现2次
0出现3次
1出现1次
2出现1次
3出现1次
4出现5次
5出现1次
9877出现1次

//原序版按出现次数输出
#include <stdio.h>

int find(int arr[], int left, int right, int data);

int main()
{

int arr[] = { 1234, 45, 0, 0, 0, 45, 3, 1, 2, 4, 4, 4, 4, 4, 1234, 5, 9877 };
int hash[65535] = { 0 };
int hash1[65535] = { 0 };
int b[65535];
int t = 0, flag = 0;
int cout = 0;
int len = sizeof(arr) / sizeof(arr[0]);
//printf("目标元素所在的下标是：%d\n", find(arr, 0, len-1, 4)); //3
for (int i = 0; i < len; i++)
{
hash[arr[i]]++;
if (arr[i] != arr[i + 1])  //更改
{
//hash[t] = hash1[arr[i]];
b[t++] = arr[i];  //避免按arr[i]排序后的顺序输出

}

}

for (int i = 0; i < t-1; i++)
for (int j = 0; j < t-1-i; j++)
{
if (hash[b[j]] < hash[b[j + 1]])
{
int h = b[j]; //交换hash数组里的下标 （内数组）
b[j] = b[j + 1];
b[j + 1] = h;

}
}
for (int i = 0; i < t; i++) //小于t 不要再小于65535因为其余部分的数据还未初始化
//会使得b[i]得到很大的随机数 大于65535而使得hash数组越界
//if (hash[b[i]] != 0)//把0次的过滤掉

{
hash1[b[i]]++;
if (hash1[b[i]]>1)
continue;

printf("%d出现%d次\n", b[i], hash[b[i]]);
cout++;

}
//printf("共有%d个独立数\n", b[65534]);//-858993460
printf("共有%d个独立数\n", cout);
return 0;
}

//结果

4出现5次
0出现3次
1234出现2次
45出现2次
3出现1次
1出现1次
2出现1次
5出现1次
9877出现1次

//按原序次数多少printf
#include <stdio.h>

int find(int arr[], int left, int right, int data);

int main()
{

int arr[] = { 1234, 45, 0, 0, 0, 45, 3, 1, 2, 4, 4, 4, 4, 4, 1234, 5, 9877 };
int hash[65535] = { 0 };
int hash1[65535] = { 0 };
int b[65535];
int t = 0, flag = 0;
int cout = 0;
int len = sizeof(arr) / sizeof(arr[0]);
//printf("目标元素所在的下标是：%d\n", find(arr, 0, len-1, 4)); //3
for (int i = 0; i < len; i++)
{
hash[arr[i]]++;
if (arr[i] != arr[i + 1])  //更改
{
//hash[t] = hash1[arr[i]];
b[t++] = arr[i];  //避免按arr[i]排序后的顺序输出

}

}

for (int i = 0; i < t - 1; i++)  //对出现次数冒泡排序
for (int j = 0; j < t - 1 - i; j++)
{
if (hash[b[j]] < hash[b[j + 1]])
{
int h = b[j]; //交换hash数组里的下标 （内数组）
b[j] = b[j + 1];
b[j + 1] = h;

}
}
for (int i = 0; i < t; i++) //小于t 不要再小于65535因为其余部分的数据还未初始化
//会使得b[i]得到很大的随机数 大于65535而使得hash数组越界
//if (hash[b[i]] != 0)//把0次的过滤掉

{
hash1[b[i]]++;
if (hash1[b[i]]>1)
continue;
for (int j = 0; j <hash[b[i]]; j++)//hash[b[i]]表示出现的次数
{
printf("%d  ", b[i]);//b[i] 表示元素值
}
printf("\n");
//printf("%d出现%d次\n", b[i], hash[b[i]]);
cout++;

}
//printf("共有%d个独立数\n", b[65534]);//-858993460
printf("共有%d个独立数\n", cout);
return 0;
}

//output
4  4  4  4  4
0  0  0
1234  1234
45  45
3
1
2
5
9877

//出现次数最大 max

#include<stdio.h>
int main()
{

int arr[] = { 1234,1234,1234,1234,1234,1234,1234,45, 45, 45, 45,  0, 0, 0, 0, 0, 45,
3, 1, 2, 4, 4, 4, 4, 4, 1234, 5, 9877 };
int hash[65535] = { 0 };
int hash1[65535] = { 0 };
int t = 0;
int len = sizeof(arr) / sizeof(arr[0]);
//printf("目标元素所在的下标是：%d\n", find(arr, 0, len-1, 4)); //3
for (int i = 0; i <len; i++)
{
hash[arr[i]]++;
}
int max = -1;
for (int i = 0; i < len; i++)
if (max < hash[arr[i]])
{
max = hash[arr[i]]; //还是按原来顺序列出的
t = arr[i];
}
printf("%d最大次数是%d\n", t, max);
return 0;
}
//output
1234最大次数是8

//无重复元素两个数组的交集  以上这几种的思路都是用空间替代时间
#include<stdio.h>
int main()
{
int arr[] = { 0,1,2,3,4 };
int arr1[] = { 1,3,5,7,9};
int hash[65535] = { 0 };
int hash1[65535] = { 0 };
int t = 0;
int len = sizeof(arr) / sizeof(arr[0]);
int  len1 = sizeof(arr1) / sizeof(arr1[0]);
//printf("目标元素所在的下标是：%d\n", find(arr, 0, len-1, 4)); //3
for ( int i = 0; i <len; i++)
{
hash[arr[i]]++;
}
for (int j = 0; j <len1; j++)
{
hash[arr1[j]]++;
}
printf("两数组和公共元素是:"); //1  3
for (int i = 0; i < 65535; i++)
if (2== hash[i])
{
printf("%d ", i);
}
printf("\n");

return 0;
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：74352次
• 积分：3028
• 等级：
• 排名：第12030名
• 原创：210篇
• 转载：128篇
• 译文：0篇
• 评论：19条
最新评论