课堂练习寻找水王

水王问题的实质就是如何快速在一串连续的数字里找到出现次数超过一半的数字。重点是最快,通过老师给出的算法思路,进行设计把这串数字放到一个数组里面,两个相邻的数字去做比较,如果相等,在向后比较,如果不等把这两个数字都置为0,标明这两个数字已经相互抵消。水王的数字最多,最后数组里面只有水王的数字(0不用去管,水王的数字是一个非零数)。

 1 public class Main {
 2     public static void main(String[] args)
 3     {
 4         //把i帖子序号d列表放到一个数组里面
 5         int[] idNum = {1,1,1,4,12,3,11,1,1,15,6,6,77,1,1,8,1};
 6         //指向前一个数和后一个数的指针
 7         int up = 0;
 8         int next = 1;
 9         //通过while循环来实现两两相消法
10         while((up < idNum.length-1)&&(next < idNum.length))
11         {
12             //如果前一个数字和后一个数字相等则指针顺次向后移动一位
13             if(idNum[up] == idNum[next])
14             {
15                 up = up + 1;
16                 next = next + 1;
17             }
18             //如果前一个数和后一个数不相等这两个数就相互消去指针顺次移动两位
19             else
20             {
21                 idNum[up] = 0;
22                 idNum[next] = 0;
23                 up = up + 2;
24                 next = next + 2;
25             }
26         }
27         
28         //两两相消完之后找到第一个不是0的数组元素找到了水王的id
29         next = 0;
30         while(next < idNum.length)
31         {
32             if(idNum[next] != 0)
33             {
34                 System.out.println("水王是"+idNum[next]);
35                 break;
36             }
37             else
38             {
39                 next = next + 1;
40             }
41         }
42         
43     }
44 
45 }

 

转载于:https://www.cnblogs.com/yinianzs/p/10095426.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值