• 软件工程——课堂练习“找水王”


    题目:

      三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖 数目超过了帖子数目的一半。
      如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
    一、设计思想
      如果ID表是有序的,由于水王ID超过总贴数一半,则在有序表中的N/2项一定是水王的ID,此时算法的复杂度为O(n*n)
      若想要时间复杂度为O(n),可以遍历ID表,两两相邻的ID进行比较,若不同则删掉,那么在剩余的ID表中水王的ID号仍然超过总数的一半,不断重复这个过程,把列表中ID总数降低,最后剩下的肯定是水王的ID。
    二、源代码
     
     1 package com.java.lianxi;
     2 
     3 public class lianxi7 {
     4     public static void main(String arg[])
     5     {
     6         int[] ids = {1,2,3,1,1,1,2,2,2,4,1,1,1,3,3,1,1,1};  
     7         System.out.println("水王的ID是"+findshuiwang(ids)); 
     8     }
     9     public static int findshuiwang(int[] id)
    10     {            
    11         int n = id.length;  
    12         int shuiwang = 0;  
    13         int count=0;  
    14         for(int i=0;i<n;i++)
    15         {  
    16             if(count == 0)
    17             {  
    18                 shuiwang = id[i];  
    19                 count = 1;  
    20             }  
    21             else
    22             {  
    23                 if(shuiwang == id[i])  
    24                     count ++;  
    25                 else   
    26                     count --;  
    27             }  
    28         }  
    29         return shuiwang;  
    30       }  
    31 }  

    三、截图

    四、心得体会

      拿到这道题,我刚开始想到的就是编历所有id,并对每个ID进行计数,但是不太容易实现,要用到结构体,后来老师提到了遍历然后排序,中间项肯定是水王ID,可是时间复杂度为n*n,为了降低时间复杂度,老师提示用消消乐的思想,后来我们就想到了如何解决。一道题目有好多种解法,我们应当拓宽思路,以后还要多练习写程序,孰能生巧。

  • 相关阅读:
    leetcode_1423. 可获得的最大点数
    leetcode_剑指 Offer 06. 从尾到头打印链表
    leetcode_剑指 Offer 05. 替换空格
    leetcode_49. 字母异位词分组
    leetcode_73. 矩阵置零
    leetcode_26. 删除排序数组中的重复项
    jstack查看JVM堆栈信息
    如何画一张架构图
    百年孤独家谱
    阿尔萨斯(Arthas)入门
  • 原文地址:https://www.cnblogs.com/maximumminimum/p/4445582.html
Copyright © 2020-2023  润新知