描述
读入一个字符串str,输出字符串str中的连续最长的数字串
输入描述:
个测试输入包含1个测试用例,一个字符串str,长度不超过255。
输出描述:
在一行内输出str中里连续最长的数字串。
示例1
输入:
abcd12345ed125ss123456789
输出:
123456789
一.暴力解题法
思路
使用快排,将数组排序,取最中间的值一定是超过一半的那个值
public int MoreThanHalfNum_Solution (int[] numbers) {
Arrays.sort(numbers);
return numbers[numbers.length/2];
}
二.哈希表
思路
将数组的每个值作为key存入,每次存入value+1
一旦value超过数组长度的一半,则返回key
public int MoreThanHalfNum_Solution (int[] numbers) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int i = 0 ; i < numbers.length ; i++){
if(!map.containsKey(numbers[i])){
map.put(numbers[i],1);
}else{
map.put(numbers[i],map.get(numbers[i])+1);
}
if(map.get(numbers[i]) > numbers.length/2){
return numbers[i];
}
}
return -1;
}
三.阵地法
思路
我们将数组的首个元素设置为阵地1,如果遇到相同的元素则,计数器+1,遇到不同元素则计数器-1;
如果当计数器为0的时候,那么我们就切换到另一个人数多的新阵地
public int MoreThanHalfNum_Solution (int[] numbers) {
int zd1 = numbers[0];//第一个阵地
int count =1;//目前存活人数
for(int i = 1; i < numbers.length ; i++){
if(zd1 == numbers[i]){//遇到相同元素的友军,存活人数+1
count++;
}else{
count--;//遇到不同元素的敌军,存活人数-1
if(count == 0){//如果存活人数为0,则投奔另一个阵地
zd1 = numbers[i];
count = 1;
}
}
}
return zd1;//返回存活人数最多的
}