java基础编程题day03--每日两题

目录

1数组中出现次数超过一半的数字_牛客题霸_牛客网

字符串中找出连续最长的数字串_牛客题霸_牛客网


题意:给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

思路一:斩蛇,蛇的长度大于管子的一半,那么从管子中间砍,必定能砍到蛇。
实现:排序之后斩掉中间

public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }
思路二:摩尔投票法,在知乎上找到的一段理解:
        核心就是对拼消耗。玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。那就大混战呗,最差所有人都联合起来对付你,或者其他国家也会相互攻击,但是只要你们不要内斗,最后肯定你赢。最后能剩下的必定是自己人。
        总结下来:自己国家的人不参与内斗,只会与其他国家的人一对一对拼消耗。
实现:时间复杂度O(N),空间复杂度O(1)
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int temp = array[0];//让第一个人出战
        int count = 1;//记录出战国家的人数
        //进行战斗
        for(int i = 1; i < array.length; ++i){
            if(temp == array[i])
                count++;//国家人数加一
            else
                count--;//对拼消耗
            if(count == 0){//已参加战斗的全部消耗完,那就让下一个人参战
                temp = array[i + 1];//下一个人参战
                count++;//该出战国家的人数就是1
            }
        }
        //for循环结束后,也就是战斗结束,只有多余一半的国家才会存活
        return temp;
    }
}

字符串中找出连续最长的数字串_牛客题霸_牛客网

读入一个字符串str,输出字符串str中的连续最长的数字串

思路一:开辟一个数组,存当前数字的长度,遇到其他字符都是0,并同时用max和index记录数组的最大值和最大值下标,最终数字串的范围就是:(最大值的下标 - 最大值 + 1, 最大值下标)

时间复杂度O(N),空间复杂度O(N)(与字符串长度有关);该方法就是好理解

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        System.out.println(fun(str));
    }
    public static String fun(String str){
        int[] arr = new int[255];
        int max = 0;//找最长
        int index = 0;//找下标
        int count = 0;//记录当前长度
        for(int i = 0; i < str.length(); i++){
            char ch = str.charAt(i);
            if(ch >= 48 && ch <= 57){ //如果是0-9
                ++count;
                arr[i] = count;//把当前长度记录在数组中
                //存储最大值以及下标
                if(max < count){
                    max = count;
                    index = i;
                }
            }else{
                count = 0;
                arr[i] = count;
            }
        }
        return str.substring(index - max + 1, index + 1);//左闭右开
    }
}

思路二:再定义两个StringBuilder变量,一个temp存放当前的数字字符串,一个ret存放最长的数字字符串,每次进行比较,如果temp的长度大于ret,则更新ret,最后返回ret

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        String ret = fun(str);
        System.out.println(ret);
    }
    public static String func(String str){
        StringBuilder temp = new StringBuilder();
        StringBuilder ret = new StringBuilder();
        int i = 0;
        for(; i < str.length(); ++i){
            char ch = str.charAt(i);
            //是数字就添加
            if(ch >= 48 && ch <= 57){
                temp.append(ch);
            }else{
                //比较长度,是否更新ret
                if(ret.length() < temp.length()){
                    ret = temp;//ret指向temp
                    //更改temp的值
                    temp = new StringBuilder();
                }else{
                    //清除temp
                    temp = new StringBuilder();
                }
            }
        }
        //此时若结尾也是字符串,那还需要在比较一次
        if(i == str.length() && ret.length() < temp.length()){
            //更新
            ret = temp;
        }
        return ret.toString();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值