每日编程(33)

题目:最长湍流子数组

题目描述:
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

		}
	}
}

后来有向了一种方法,用一个数组存储出现的值,因为如果不出现重复,输出即可,出现重复才考虑情况。

今天笔试太差劲了,还是做的题太少,心态也不好,太慌了,越慌越做不出来,再加大联系吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值