题目:最长湍流子数组
题目描述:
978. 最长湍流子数组 显示英文描述
用户通过次数 196
用户尝试次数 229
通过次数 200
提交次数 567
题目难度 Medium
当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:
若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
返回 A 的最大湍流子数组的长度。
示例 1:
输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:
输入:[4,8,12,16]
输出:2
示例 3:
输入:[100]
输出:1
分析:
前后状态相关,所以需要标记一下上次的状态,又因为状态就是三种,A[i]<A[i-1];A[i]>A[i-1];A[i]=A[i-1],所以我们利用一个标记为flag(-1,0,1)来分别代表三种状态,这样在确定此节点的状态是就可以与上一个节点的状态进行推理,如果满足要求res++,如果不满足要求res=2,然后更换此次状态,我们来看一下代码
代码:
func maxTurbulenceSize(A []int) int {
n:=len(A)
res:=1
tmp:=1
flag:=0
for i:=1;i<n;i++{
if i==1{
if A[i]<A[i-1]{
tmp++
flag=-1
}else if A[i]>A[i-1]{
flag=1
tmp++
}else{
flag=0
}
res=max(res,tmp)
}else{
if A[i]>A[i-1]{
if flag==-1{
tmp++
}else{
tmp=2
}
flag=1
}else if A[i]<A[i-1]{
if flag==1{
tmp++
}else{
tmp=2
}
flag=-1
}else{
tmp=1
flag=0
}
res=max(res,tmp)
}
}
return res
}
func max(a,b int)int{
if a>b{
return a
}
return b
}
当i==1时,要单独列出来,先标记一个状态,tmp就是用来存储从一个点出发满足要求的个数,每次res就保存最大值即可,注意当只有一个数时,返回1,两个数不相等就是2,相等就是1
题目:字符串规整
题目描述:记得不太清了,是今天参加字节跳动笔试的题,第二题,因为最近一直用go,所以也选择了go,结果一直出错,一直找错,最后也是吉吉了,但是也是不服气,试了很多遍算是做出来了
代码:
package main
import "fmt"
func main(){
s:=""
fmt.Scan(&s)
n:=len(s)
if n<=2{
fmt.Println(s)
}
res:=[]int{} //res按顺序存储出现的个数集
res=append(res,1) //第一个肯定最少有一个
for i:=1;i<n;i++{
if s[i]!=s[i-1]{
res=append(res,1)
}else{
res[len(res)-1]++
}
}
k:=len(res)
r:=0 //r在s中移动
i:=0 //这里i在res中移动
for i<k && r<n{
if res[i]==1{ //如果是1 ,输出当前字符,调正位置
fmt.Printf(string(s[r]))
r++
i++
}else if res[i]==2{ //出现重复
fmt.Print(string(s[r]),string(s[r+1]))
r=r+2 //调正s中的位置
if i==k{ //如果是最后一个元素就退出
break
}
if i+1<k && res[i+1]>=2{ //下一个也是重复,那么只能保留一个才能满足条件
res[i+1]=1
}
i++
}else{ //如果出现多个只能留下两个,调正s中的位置,res不调整,下次会输出
r=r+res[i]-2
res[i]=2
}
}
}
后来有向了一种方法,用一个数组存储出现的值,因为如果不出现重复,输出即可,出现重复才考虑情况。
今天笔试太差劲了,还是做的题太少,心态也不好,太慌了,越慌越做不出来,再加大联系吧