数字出现次数和map的应用

原创 2016年08月28日 14:37:00

//大家都用的异或,其实最简单的还是用哈希表 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;
}




2路bit-map的应用:test.txt中有42亿个无符号整数,从小到大打印其中只出现过一次的数 。限制: 可用内存为1.5GB.

先看这样一个问题:test.txt中有42亿个无符号整数,从小到大打印其中只出现过一次的数 。限制: 可用内存为1.5GB.           前面, 我们已经深入讨论了bit-map, 在本文中,...
  • stpeace
  • stpeace
  • 2015年06月28日 18:17
  • 1068

【面试题】不用map,求出现频率超过总数一半的数字

有一个整数的数组,求出现频率超过总数一半的数字,没有找到,则返回-1  如: [1,2] => -1 [1,1,2,3] => -1(没有超过一半,总数4,出现2次,没有超过一半) [2,1...
  • mn960mn
  • mn960mn
  • 2015年04月19日 13:59
  • 807

Map实现从0~100中随机生成50个数,统计出现的数字最大值和最小值,输出出现最多的次数及对应的数字

Map实现从0~100中随机生成50个数,统计出现的数字最大值和最小值,输出出现最多的次数及对应的数字 #include "stdafx.h" #include #include #inclu...

zzulioj 1204 剔除相关数(map和vector的应用)

Description 一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。 Input ...

异或的应用 及剑指offer 面试 40 数组中只出现一次的数字

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27568975     这篇文章没有代码,介绍的是纯理论的思路。  ...

Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等

写道在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。本节就以一个展示手机内联系人数量的例子来...

Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等

写道 在我们开发一些如短消息、应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用商店上加上可以升级的应用数量,这样不占太大空间还能达到提示的目的。 本节就以一个展示手机内联...
  • strliu
  • strliu
  • 2011年08月14日 14:08
  • 725

hls流媒体:ts流格式介绍 已有 2028 次阅读2015-2-26 14:13 |个人分类:视频直播| 流媒体 1.ts简介 ts流最早应用于数字电视领域,其格式非常复杂包含的配置信息表

hls流媒体:ts流格式介绍 已有 2028 次阅读2015-2-26 14:13 |个人分类:视频直播| 流媒体 1.ts简介      ts流最早应用于数字电视领域,其格式非常复...

Flex Google Map桌面地图应用程序

  • 2010年06月27日 19:26
  • 554KB
  • 下载

TrainStation(android map应用实例)

  • 2011年04月13日 22:20
  • 52KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数字出现次数和map的应用
举报原因:
原因补充:

(最多只允许输入30个字)