2.3 寻找发帖“水王”

水王发帖超过数目超过帖子总数的一半,你有一个当前论坛上所有帖子的列表,其中帖子作者ID也在表中,快速找到这个水王、


一、对所以的ID排序,然后扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为O(N*log N +N)。


如果ID列表已经是有序的,还需要扫描一遍整个列表来统计各个ID出现的次数吗?


二、如果一个ID出现的次数超过总数N的一半。那么无论水王的ID是什么,这个有序的ID列表中的第N/2项(从0开始编号)一定会是这个ID。不必再次扫描列表。如果能够迅速定位到列表的某一项(比如使用数组来存储列表),除去排序的时间复杂度,后处理需要的时间为O(1).


三、如果每次删除两个不同的ID(不管是否包含“水王”的ID),那么剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到答案。新的思路,避免了排序这个耗时的步骤,总的时间复杂度只有O(N),且只需要常数的额外内存。


Type Find(Type *ID,int N) {
	Type candidate;
	int nTimes,i;
	for(i=nTimes=0;i<N;i++){
		if(nTimes==0) {
			candidate=ID[i],nTimes=1;
		}
		else {
			if(candidate == ID[i])
				nTimes++;
			else
				nTimes--;
		}
	}
	return candidate;
}


扩展问题

现在有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4,你能从发帖ID列表中快速找出他们的ID吗?

思路与本题一样用抵消法,每次删除 4 个不同的ID即可。

Type candidate[3];
void Find1(Type *ID, int N){
    int nTimes[3] = {0}, i;
    for(i = 0; i < N; ++i){
        if(nTimes[0] == 0){
            candidate[0] = ID[i], nTimes[0] = 1;
        }else if(nTimes[1] == 0){
            candidate[1] = ID[i], nTimes[1] = 1;
        }else if(nTimes[2] == 0){
            candidate[2] = ID[i], nTimes[2] = 1;
        }else{
            if(candidate[0] == ID[i])
                nTimes[0]++;
            else if(candidate[1] == ID[i])
                nTimes[1]++;
            else if(candidate[2] == ID[i])
                nTimes[2]++;
            else{
                nTimes[0]--;
                nTimes[1]--;
                nTimes[2]--;
            }
        }
    }
}


【编程之美学习笔记】2.3寻找发帖水王

寻找发帖“水王”

### 寻找活跃的Java论坛帖子或讨论 为了找到关于Java相关的高产帖子或讨论,可以通过以下几个途径来获取有价值的信息: #### 1. Stack Overflow Stack Overflow 是一个非常受欢迎的技术问答网站,其中包含了大量有关Java的问题和解答。通过搜索特定的关键字,如“Java performance optimization”,可以发现很多高质量的话题讨论[^1]。 #### 2. Reddit 社区 Reddit 上有许多专门针对编程和技术交流的子版块(subreddit),比如 r/learnprogramming 和 r/java 。这些地方经常会有开发者分享自己的经验、遇到的问题以及解决方案。参与这样的社区可以帮助更好地理解当前流行的Java话题和发展趋势[^2]。 #### 3. 官方 Oracle Java 论坛 作为Java官方维护者Oracle所运营的一个重要资源中心,这里不仅有来自世界各地的专业人士发表的文章,还有机会直接向专家提问并获得反馈。这使得该平台成为一个不可多得的学习与交流场所。 #### 4. GitHub Discussions 许多开源项目都会在其GitHub页面设置Discussion板块供贡献者们沟通协作。对于那些想要深入了解某些具体库或者框架的人来说,这里是很好的起点。例如Spring Boot就有自己活跃的discussion area,能够帮助用户解决实际编码过程中碰到的各种难题。 ```python import webbrowser def open_forum_links(): forums = [ ("Stack Overflow", "https://stackoverflow.com/questions/tagged/java"), ("Reddit r/java", "https://www.reddit.com/r/java/"), ("Official Oracle Java Forum", "https://community.oracle.com/community/java"), ("Spring Boot Discussion on GitHub", "https://github.com/spring-projects/spring-boot/discussions") ] for name, url in forums: print(f"Opening {name}...") webbrowser.open(url) open_forum_links() ``` 上述Python脚本可以根据个人喜好修改链接列表中的内容,并自动打开浏览器标签页访问指定网址,方便快捷地浏览各个热门Java论坛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值