题目:过年了,小白抢到了很多红包,要求找出所有的红包中出现次数大于红包总数二分之一的金额。写出算法与代码
抽象题目为:在一组数中,查找某一个出现次数超过总数字一半的数字
Tips:hashmap
可以创建一个hash表,实现统计所有的红包出现的次数,一旦出现满足要求的金额数,则停止统计
#include "stdafx.h"
#include <iostream>
#include<vector>
#include <unordered_map>
#include <string>
using namespace std;
string cash(vector<string> &num){
unordered_map<string, int> mymoney;
int flag = 0;
for (int i = 0; i < num.size(); i++){
mymoney[string(num[i])]++;
if (mymoney[string(num[i])] > num.size() / 2){
flag = i;
break;
}
}
if (!flag){
return "Not Find!";
}
return num[flag];
}
int main(){
string c[6] = { "11.001", "11.1", "11.113", "11.1", "11.1", "11.12" };
vector<string> a(c, c + 6);
cout << cash(a) << endl;
}
因为查找的是所有红包中,出现次数大于红包总数一般的金额,所以在函数 cash 的 if 语句中,只要找到该次数出现满足条件便不在循环。
其实我理解的考点是:哈希表
在C++中 函数 unordered_map ,由他想到的:unordered 散列容器 ( hash container ) 是一种非常重要的容器类型,它通常比二叉树的存储方式可以提供更高的访问效率。
鸣谢: DeYuanZhang, 指出了我原来代码中的bug,现在呈现的是修改之后的形式
之前的版本中,出现问题的是 有double--> char,因为double占8bytes,而char占一个字节,所以在转换中会出现高位截断的问题。