题目

春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。

给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。

若没有金额超过总数的一半,返回0。

数据范围:1 <= n <= 1000,红包金额满足1 <= gifti <= 100000。

示例1

输入 [1,2,3,2,2],5

输出 2

示例2

输入 [1,1,2,2,3,3],6

输出 0


思路

↑最简单思路:

分别算出每个红包金额出现次数,再找出出现次数过半的金额。

↑进阶思路:

考虑到时间/空间复杂度,是否可以优化为时间复杂度O(n),空间复杂度O(1)呢?那就是只在原数组遍历一次而不申请其他数组。

挖掘题目所给的重要信息:红包金额出现次数超过“一半”(而不是1/3或1/4),so求解方法与“一半”有关。是否只用求出该红包金额,而不用算出该红包出现次数呢~可以!在求解时次数可以加以利用并改变。

so~遍历原数组,只要是两个不同的金额,就直接抵消掉,最后剩哪个就是哪个过半。

具体解法:计数+验证

  • 让key最初暂为数组第一个元素,而后在数组遍历中不断更新,用来保存最终的候选值。
  • count最初是1,用来计数。
  • 遍历数组(从数组第二个元素开始遍历)
  1. 若当前所遍历的数组元素值与当前key值相等,则count+1。
  2. 若当前所遍历的数组元素值与当前key值不等,则count-1。
  3. 若count为0,说明互相抵消完,前一个候选的值不是超过一半的数,则更新候选值,改变key值为此时遍历的数组下标所对应的数组元素值,还原count为1。
  • 判断key出现的次数是否大于数组长度的一半,若大于,则return key;否则,return 0。

代码

public class WeChatRedEnvelope {public int weChatRedEnvelope(int[] gifts, int n) {//遍历原数组,只要是两个不同的金额,就直接抵消掉,最后剩哪个就是哪个过半int key = gifts[0];int count = 1;for (int i = 1; i < n; i++) {if(gifts[i] == key) {count++;} else {count--;}if(count == 0) {key = gifts[i];count = 1;}}//判断key出现的次数是否大于数组长度的一半int num = 0;for (int i = 0; i < n; i++) {if(gifts[i] == key) {num++;}}//此时num为key重复的次数if(num > (n / 2)) {return key;} else {return 0;}}
}

2-微信红包(2016腾讯校招)相关推荐

  1. 2016校招真题编程练习——微信红包(腾讯)

    题目描述 春节期间小明使用微信收到很多个红包,非常开心.在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半.请帮小明找到该红包金额.写出具体算法思路和代码实现,要求算法尽可能高效. ...

  2. 多个微信红包,支付宝红包免费领

    福利分享,亲测有效.多个支付宝,微信红包免费领取,分分钟到账. 最高10元微信红包 最高100元支付宝红包 可帮忙协助提现支付宝红包 最低1元微信红包免费领 最低1元支付宝红包免费领 最低1元微信红包 ...

  3. 名企笔试:腾讯2016招聘笔试(微信红包)

    名企笔试:腾讯2016招聘笔试(微信红包) 题目描述 春节期间小明使用微信收到很多个红包,非常开心.在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半.请帮小明找到该红包金额.写出具 ...

  4. 腾讯 2016 春季实习校招二面回忆(C++后台)

    感谢您对博文的关注!有需要内推腾讯的可以 QQ(1589276509)联系我哈,期待您的加入. 文章目录 1.前言 2.问题汇总 3.小结 参考文献 1.前言 2016-04-12 日下午在广州东圃喜 ...

  5. 腾讯2016校园招聘·成都线路 移动开发方向,本人止步于二面——腾讯校招面经。

    已经大三,马上就要去实习了,找实习工作是个问题,一个偶然的机会,有幸去了 腾讯2016校园招聘·成都线路,虽然最后在二面被刷下来了,但是也算是一段比较有意义的经历,写下来,算是一个面试的一个提醒,也给 ...

  6. 腾讯 2016 春季实习校招模拟笔试

    1.生成格雷码 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回 n ...

  7. 高并发资金交易系统设计方案—百亿双十一、微信红包背后的技术架构

    21CTO社区导读 : 今天带来的是一个长篇文章.主要讲解高可用的互联网交易系统架构,包括双十一.支付宝&微博红包技术架构,以及微信红包的技术架构,希望能给各位提供价值. 概述 话说每逢双十一 ...

  8. 支付宝微信红包战背后的算盘

    五福卡斗毛玻璃照:支付宝微信红包战背后的算盘(转) 来源:2016年02月03日 每日经济新闻 ◎每经记者 蒋佩芳 植根中国的互联网公司越来越接地气,中国文化独有的春节红包正被支付宝和微信整合成社交和 ...

  9. 2016腾讯面试经验

    [实习面试]阿里&腾讯offer的点点滴滴(内附干货)2016 前言: - 4月8号下午6点,突然接到腾讯hr的电话,本来已经不抱希望的我一脸懵逼,差点连自我介绍都不会说了.之所以不抱希望,是 ...

最新文章

  1. 数据竞争(data race)问题分析的利器——valgrind的Helgrind
  2. 关东升的《从零开始学Swift》3月9日已经上架
  3. 接口测试 -- 关闭 requests 打开的 file
  4. 4G EPS 中建立 UE 和 MME 之间的 NAS(非接入服务)信令连接
  5. R语言学习笔记:向量
  6. loj 1210 (求最少的加边数使得图变成强连通)
  7. python学习高级篇(part8)--类对象的特殊方法
  8. SQLAlchemy 一些基本操作
  9. 居民配电所智能辅助监控系统
  10. selectpicker.js的属性和方法
  11. 如何在PC上显示Hololens的视野
  12. ESP32系列:Unhandled debug exception 、Doubled exception错误
  13. 比亚迪F6专用高清车载导航影音登场
  14. ssm整合说明与模板-Spring Spring MVC Mybatis整合开发
  15. 总是腰疼背痛 竟是“穿错鞋”惹的祸
  16. 微信小程序云开发(数据库)
  17. (十)基于Linux算时差——超声波测距原理及代码实现
  18. logback - 自定义日志脱敏组件,一种不错的脱敏方案
  19. MySQL数据库的简述
  20. mysql里面column是什么意思_column是什么意思

热门文章

  1. exit和_exit
  2. Java数组截取如何实现?Java语言教程
  3. 【笨嘴拙舌WINDOWS】实践检验之GDI缩放
  4. 华为桌面云如何部署Linux,华为桌面云安装部署指南(19页)-原创力文档
  5. node如何检测摄像头是否在线
  6. 第一个C++语言,用的VS2019,感觉不错
  7. jp@gc - Ultimate Thread Group、jp@gc - Response Times vs Threads实践使用
  8. 用手机画画什么触控笔比较好?触控笔四大品牌推荐
  9. 精选汇总文章(更新于2019-08-09)
  10. 四川科技馆 智能控制 协议设计(skycto JEEditor)