所有的红包中出现次数大于红包总数的二分之一-笔试系列二

题目:过年了,小白抢到了很多红包,要求找出所有的红包中出现次数大于红包总数二分之一的金额。写出算法与代码

抽象题目为:在一组数中,查找某一个出现次数超过总数字一半的数字

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占一个字节,所以在转换中会出现高位截断的问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值