目录
题意:给一个长度为 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();
}
}