算法题,水王数的处理。

不及小步无以至千里,所以想要增强自己,只有不断练习。如果小编的文章对你有帮助,不要忘了关注加点赞哦!

目录

什么是水王数?

有什么用?

解体思路!

完整代码:


什么是水王数?

水王数:在一个列表当中出现次数超过总次数一半的数。

有什么用?

比如说美国的选举投票,总统想要一半以上的票,不然就重新进行选择投票。

解体思路!

题型:给定一个数列,请求出出现次数大于一半以上的数?要求:时间复杂度O(n),额外空间复杂度O(1)

1,首先我们需要2个变量,一个存储候选人(voters)一个统计候选人消除出现次数(hp)

2,逻辑思路:候选人出现次数大于所以其他数的总和,遍历数组,选取第一个个数为候选人,给定消除次数为1,当下一个数与候选人相同加1,(不同减1,并让下一个数当候选人),如此反复遍历到末尾的数,

#代码实现
 for num in ls:
        if hp == 0:#消除数后次数为0,创建候选
            voters = num
            hp = 1  #给它出现次数
        elif voters != num: #如果数值与候选不一样-1
            hp -= 1
        else:#反之,相同加一
            hp += 1

(有一种特殊情况,类似(1,2,3,4,5)用上面逻辑水王数就为5,但实际情况并不是,所以需要一个变量来统计一下候选人出现次数,当出现次数大于数组一半以上时,就确定是水王数)

#代码实现
 cont = 0  # 出现次数
    for i in ls:
        if i==voters:
            cont+=1
    if cont>=len(ls)/2:
        return voters
    else:
        return -1

完整代码(python):

'''
水王数的解决
作者:ls富
time:2021/6/4
'''
def witer_num(ls):
    if len(ls)==0:
        return -1
    voters=0 #候选
    hp=0 #出现消除后次数
    for num in ls:
        if hp == 0:#消除数后次数为0,创建候选
            voters = num
            hp = 1  #给它出现次数
        elif voters != num: #如果数值与候选不一样-1
            hp -= 1
        else:#反之,相同加一
            hp += 1
    # 如果遍历完成后,没有候选
    if hp == 0:
        return -1
    #有候选情况
    cont = 0  # 出现次数
    for i in ls:
        if i==voters:
            cont+=1
    if cont>=len(ls)/2:
        return voters
    else:
        return -1
if __name__ == '__main__':
    ls=[3,2,3,3,3,4,5]
    print(witer_num(ls))

 完整代码(java版):

package com.itheima;

import java.util.Scanner;



public class Test {
    public static void main(String[] args) {
        int arr[]=new int[]{1,2,2,3,3,3};
        System.out.println(water_number(arr));
    }
    public static int water_number(int[] args) {
        if(args.length==0){
            return -1;
        }
        int voters=0;
        int hp=0;
        int count=0;
        for (int i =0;i<=args.length-1;i++){
            if(hp==0){
                voters=args[i];
                hp=1;
            }else if(voters !=args[i]){
                hp--;
            }else {
                hp++;
            }
        }
        if (hp == 0){
            return -1;
        }
        for (int i =0;i<=args.length-1;i++){
            if(args[i]==voters) {
                count++;
            }
        }
        if(count>=args.length/2){
            return voters;
        }else {
            return -1;
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韶光不负

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值