牛客笔试题day03

一、字符串中找出连续最长的数字串

1. 题目描述

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

2. 输入描述

个测试输入包含1个测试用例,一个字符串str,长度不超过255。

3. 输出描述

在一行内输出str中里连续最长的数字串。

4. 示例

输入:
abcd12345ed125ss123456789
输出:
123456789

5. 解题思路

  1. 先用split() 方法将字符串 s 按照非数字字符进行分割
  2. 遍历字符串,使用split[]数组去记录连续的数字串,如果遇到不是数字字符,则表示一个连续的数字串结束;
  3. 定义一个空字符串变量temp=“”,for循环遍历split[]数组,将temp先跟split[]数组中的第一个数字串比较,如果split[]数组长度更长,则更新temp=split[i];
  4. 之后用更新的temp和split[i]比较,使得temp永远保存着连续最长的数字串。

6. 代码

import java.util.Scanner;

public class longest_Number {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        // split() 方法将字符串 s 按照非数字字符进行分割
        //将字符串分割成若干个数字子串,并将这些数字子串存储在 split 数组中
        String []split=s.split("[^0-9]");
        //定义了一个名为 temp 的空字符串变量,后续做比较的时候使用
        String temp="";
        //如果temp的长度小于split的长度,更新,使得temp永远保存着连续最长的数字串
        for (int i = 0; i < split.length; i++) {
            if(temp.length()<split[i].length()){
                temp=split[i];
            }
        }
        System.out.println(temp);
    }
}

二、数组中出现次数超过一半的数字

1. 题目描述

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:n \le 50000n≤50000,数组中元素的值 0 \le val \le 100000≤val≤10000
要求:空间复杂度:O(1)O(1),时间复杂度 O(n)O(n)

2. 输入描述:

保证数组输入非空,且保证有解

3. 输出描述

输出出现次数超过数组长度一半的数字。

4. 示例

输入:[1,2,3,2,2,2,5,4,2]
返回值:2

输入:[3,3,3,3,2,2,2]
返回值:3

输入:[1]
返回值:1

5. 解题思路

  1. 先进行base case判断,if(array.length==1){return array[0];}如果数组长度为1;则直接返回该数;
  2. 利用sort()方法对所有的数字进行从小到大的排序;
  3. 定义count,记录数组中一个数出现的次数;定义num,记录数组中一个数的值;
  4. 遍历array数组;每次数值相等,count++,如果一个数出现的次数大于数组长度的一半,直接返回该数array[i];否则i++;继续遍历,此时需要count重新置为1;把新的array[i]赋值给num;
  5. 遍历结束,如果还是没有找到,return 0。

6. 代码

import java.util.Arrays;

public class MoreThanHalfNum {
    public int MoreThanHalfNum(int[] array) {
        //base case
        if(array.length==1){
            return array[0];
        }
        Arrays.sort(array);
        int count=1;
        int num=array[0];
        for (int i = 1; i < array.length; i++) {
            if(array[i]==num){
                count++;
                if(count>array.length/2){
                    return array[i];
                }
            }else{
                count=1;
                num=array[i];
            }
        }
        return 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值