题目: 寻找发帖"水王"

  • 来源: 编程之美

分析

  • 衍生:就是给定一个数组,其中某个元素出现次数超过了数组长度的一半,找出这个元素

方法s

方法1

对这个串进行遍历,同时对出现的元素进行计数,可以用map,最后遍历map取出计数值最大的那个元素

方法2

可以对数组进行排序,第N/2个元素就是所求,下表从0开始

方法3

上面两个方法都有排序操作,时间复杂度不可观。

可以一次遍历, 在遍历过程中删除两个不同的元素(不管是不是出现次数最多的那个元素),最后剩下的就是所求。

实现

/**
* @ClassName: Demo1
* @Author: fanjiajia
* @Date: 2018/12/19 下午8:35
* @Version: 1.0
* @Description: 某个字符串数组中存在出现次数超过该数组长度一半的某一个串,找出来
*/
public class Demo1 { public static void main(String[] args) {
String strs[] = {"a","3", "a", "d","a", "4","6","a", "a"};
System.out.println(func1(strs));
} /**
* @Author fanjiajia
* @Date 下午9:03 2018/12/19
* @Description
**/
public static String func1(String[] strs) {
/*
方法一: 遍历一次,对每一个串出现的次数进行累计
方法二: 按照出现的次数进行排序,第N/2个必然是这个串,下标从0开始
方法三: 上面的方法都会出现排序,时间复杂度高,可以一次遍历,直接获取
每一次删除其中两个不同的串,那么最后剩下的必然是我们所需要的
*/
String candidate = ""; // 保存可能是那个串
int nTimes, i; // nTimes操作逻辑:与之不匹配消除一对id时减少1,否则加1
for (i = nTimes = 0; i < strs.length; i++) {
if (nTimes == 0) { // ==0 说明遍历过程前面的都已经配对消除了
candidate = strs[i];
nTimes = 1;
}else { // 说明前面有某个串没有完全配对消除
if (strs[i] == candidate) // 当前串和那个串相同,则计数值+1,否则用当前这个不同的串进行消除
nTimes ++;
else
nTimes --;
}
}
return candidate;
}
}

泛型实现

这里默认是字符串数组,但是在实际运用时,肯定还有其他类型,所有采用泛型实现,问题就能迎刃而解;

/**
* @Author fanjiajia
* @Date 下午7:50 2018/12/20
* @Description 数组中存在出现次数超过一半的元素,找出来,泛型实现
**/ public <T> T func2(T[] arr) {
T candidate = null;
int nTimes,i;
for (i = nTimes = 0; i < arr.length; i++) {
if (nTimes == 0) {
candidate = arr[i];
nTimes = 1;
}else {
if (arr[i] == candidate)
nTimes++;
else
nTimes--;
}
}
return candidate;
}
  • 调用
 Integer arr[] = {1,2,3,1,2,1};
Demo1 demo1 = new Demo1();
System.out.println(demo1.func2(arr));

衍生问题

  1. 数组中存在3个元素,切出现次数超过了数组长度的1/4,求这三个元素
  2. 数组中存在1一个元素,出现次数刚好只有数组长度的一半,找出来

最后

生命不息,使劲造

编程练习:寻找发帖"水王"的更多相关文章

  1. 编程练习:寻找发帖"水王"扩展问题一

    回顾 寻找发帖水王的问题总结起来就是在一个数组中某一个元素出现次数超过了数组长度的一半,那么可以很顺利的找到这个元素,实现见"编程练习:寻找发帖水王" 扩展 上面的问题中,强调了某 ...

  2. 编程练习:寻找发帖"水王"扩展问题二

    回顾 在前面两篇文章已经实现了水王id出现次数超过一半,以及水王id出现次数刚好一半 分析 借助上面水王id出现次数刚好出现一半的分析,其实这里就是找出数组中出现次数前三的元素,具体的分析,见前面两篇 ...

  3. Find发帖水王哥

    Find发帖水王 传说贴吧有一大“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子总数的一半.如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的 ...

  4. HTTP 笔记与总结(4 )socket 编程:批量发帖

    浏览器发送 POST 请求: 表单 form.html <!doctype html> <html lang="en"> <head> < ...

  5. 网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

    传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5, ...

  6. Java for LeetCode 229 Majority Element II

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  7. Majority Element || leetcode

    编程之美上一样的题目.寻找发帖水王. 利用分治的思想. int majorityElement(int* nums, int numsSize) { int candidate; int nTimes ...

  8. 查找出现次数大于n/k的重复元素

    本文是对一篇英文论文的总结:Finding Repeated Elements.想看原文,请Google之. 这个问题的简单形式是“查找出现次数大于n/2的重复元素”.我们先从简单问题开始,然后再做扩 ...

  9. CATALOGUE 目录

    1 语言基础 1.1 c/c++ [转]C/C++ 存储类型 作用域 连接类型 [转]C/C++内存划分 [转]C/C++除法实现方式及负数取模详解 [转]为什么C++编译器不能支持对模板的分离式编译 ...

随机推荐

  1. 关于alert后,才能继续执行后续代码问题

    如果在正常情况下,代码要在alert之后才执行,解决办法:将要执行的代码用setTimeout延迟执行即可(原因:页面未加载完毕) 首先,先说明问题情况: 如下JS代码,不能正常执行,只有在最前面加上 ...

  2. js的事件流你真的弄明白了吗?

    当浏览器发展到第四代时候,浏览器开发团队遇到了一个有意思的问题:页面的哪一部分会拥有某个特地的事件?要明白这个问题问的是什么,可以想象画在纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的不 ...

  3. POST和GET请求区别

    最新博客站点:欢迎来访 1. 请求长度的限制 在HTTP协议中,从未规定GET/POST的请求长度限制,对于GET,对url的限制来源于浏览器或web服务器,浏览器和服务器限制了url的长度.因此,在 ...

  4. swiper不能手指滑动翻页的解决办法

    /*当swiper中的slide的里面放入长度在手机上不能滑动的时候 放入这段代码就可以了*/    var startScroll, touchStart, touchCurrent;        ...

  5. ABAP术语-Lock Argument

    Lock Argument 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/29/1085717.html Locked fields in ...

  6. centos7中vsftp的搭建

    开启vsftpd:service vsftpd start关闭vsftp:service vsftpd stop 安装vsftpd: yum -y install vsftpd 建立vsftpd帐号: ...

  7. MAC系统如何显示隐藏文件解决方法

    苹果Mac OS 操作系统下,隐藏文件默认为隐藏状态,隐藏文件是否显示有多种方法可以设置. 方法一: 打开终端,输入命令行 1.显示Mac隐藏文件的命令: defaults write com.app ...

  8. web前端总结面试问题<经常遇到的手写代码>

    冒泡排序 var arr = [5,8,3,6,9] for(var i=0;i<arr.length;i++){ for(var j=i+1;j<arr.length;j++){ if( ...

  9. Asp.Net Core 生成图形验证码

    前几天有朋友问我怎么生成图片验证码,话不多说直接上代码. 支持.NET CORE开源.助力.NET Core社区发展. using System; using System.IO; using Sys ...

  10. Django自带后台使用配置

    参考官网地址:https://docs.djangoproject.com/en/1.11/ref/contrib/admin/ ,本文章值是介绍简单配置,如果需要详细内容可以查阅官方文档 自动管理界 ...