一、字符串中找出连续最长的数字串
1. 题目描述
读入一个字符串str,输出字符串str中的连续最长的数字串
2. 输入描述
个测试输入包含1个测试用例,一个字符串str,长度不超过255。
3. 输出描述
在一行内输出str中里连续最长的数字串。
4. 示例
输入:
abcd12345ed125ss123456789
输出:
123456789
5. 解题思路
- 先用split() 方法将字符串 s 按照非数字字符进行分割
- 遍历字符串,使用split[]数组去记录连续的数字串,如果遇到不是数字字符,则表示一个连续的数字串结束;
- 定义一个空字符串变量temp=“”,for循环遍历split[]数组,将temp先跟split[]数组中的第一个数字串比较,如果split[]数组长度更长,则更新temp=split[i];
- 之后用更新的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. 解题思路
- 先进行base case判断,if(array.length==1){return array[0];}如果数组长度为1;则直接返回该数;
- 利用sort()方法对所有的数字进行从小到大的排序;
- 定义count,记录数组中一个数出现的次数;定义num,记录数组中一个数的值;
- 遍历array数组;每次数值相等,count++,如果一个数出现的次数大于数组长度的一半,直接返回该数array[i];否则i++;继续遍历,此时需要count重新置为1;把新的array[i]赋值给num;
- 遍历结束,如果还是没有找到,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;
}
}