题目: 寻找发帖"水王"

  • 来源: 编程之美

分析

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

方法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. 数据库:DDL/DML/DCL/TCL基本概念

    SQL(Structure Query Language)语言是数据库的核心语言 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE 子句组成的查询块: ...

  2. BZOJ 1193--马步距离

    1193: [HNOI2006]马步距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2267  Solved: 1026[Submit][Stat ...

  3. 【PTA 天梯赛】L2-1 分而治之(结构体存边)

    分而治之,各个击破是兵家常用的策略之一.在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破.为此参谋部提供了若干打击方案.本题就请你编写程序,判断每个方案的可行性 ...

  4. mysql创建表时反引号的作用

    试用navicat工具查看现网mysql建表语句时,发现表名和字段名都是反引号引起来的 CREATE TABLE `tab_notice_title_tv` ( `i_id` ) NOT NULL A ...

  5. MySQL快速生成连续整数

    很多时候需要用到连续的id进行数据对比,如判断是否连续等问题.那么,生成连续整数的方式有多种,首先容易想到的是逐步循环,如果想生成1kw条记录,则需要循环1kw次进行插入,那么有没有其他方式呢,效率相 ...

  6. Lavavel5.5源代码 - Pipeline

    <?php class Pipeline { protected $passable; protected $pipes = []; protected $method = 'handle'; ...

  7. ecshop漏洞修复 以及如何加固ecshop网站安全?

    由于8月份的ECSHOP通杀漏洞被国内安全厂商爆出后,众多使用ecshop程序源码的用户大面积的受到了网站被篡改,最明显的就是外贸站点被跳转到一些仿冒的网站上去,导致在谷歌的用户订单量迅速下降,从百度 ...

  8. unity独立游戏开发日志2018/09/22

    f::很头痛之前rm做的游戏在新电脑工程打不开了...只能另起炉灶... 还不知道新游戏叫什么名...暂且叫方块世界.(素材已经授权) 首先是规划下场景和素材文件夹的建立. unity常用的文件夹有: ...

  9. C语言实现斐波那契数列

    1.函数一用递归实现 2.函数二用循环实现 #include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) ...

  10. 线程基础三 使用C#中的lock关键词

    C#中lock关键字主要是为确保当一个线程使用某些资源时,同时无法其他线程无法使用该资源.下面我们看看下面的小例子. static void Main(string[] args) { var c = ...