关闭

数字出现次数和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];
    }

};


用num1和num2来接收


题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

二、

数字在排序数组中出现的次数
  • 参与人数: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;   
  }
};  
方法3:
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;


    }
    };  
方法4:class Solution {
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(inti=0;i<str.size();i++) {
            if(mp.count(str[i])){
                mp.erase(str[i]);
            }else{
                mp[str[i]] = i;
            }
        }
        for(inti=0;i<str.size();i++){
            if(mp.count(str[i])){
                returnmp[str[i]];
            }
        }
        return-1;
 
    }
};

频率错误版:
#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;
}





讲自定义hash:



//排序版
#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次
共有8个独立数
请按任意键继续. . .


//原序版 按原顺序输出  方法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次
共有9个独立数
请按任意键继续. . .



//原序版按出现次数输出
#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次
共有9个独立数
请按任意键继续. . .




//按原序次数多少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
共有9个独立数
请按任意键继续. . .


//出现次数最大 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条
    最新评论