594. 最长和谐子序列-简单
题目描述:
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
题解:
哈希表存储每个值出现的次数,再遍历哈希表寻找每个值和每个比它大1的值出现的次数之和,用一个临时变量保存最大的值即为所求解
代码(Go):
func findLHS(nums []int) int {
dict := map[int]int{}
for _,v := range nums{
if _,ok := dict[v];ok{
dict[v]++
}else{
dict[v] = 1
}
}
temp := 0
for i,v := range dict {
if _,ok := dict[i + 1];ok{
if v + dict[i + 1] > temp{
temp = v + dict[i + 1]
}
}
}
return temp
}
925. 长按键入-简单
题目描述:
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。
你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True
题解:
双指针。分别指向两个字符串的当前比对位置进行比较,同时还需要一位标志位作为对比失败的缓冲。若对比相等则标志位置0,type指针加一,若对比失败则name指针加一同时标志位置1。若对比成功时二者的下一位也相等则同时加一,若对比失败时标志位为1则返回false,最后还要看name是否遍历完了,若没有遍历完则也要返回false。
这题判断逻辑写复杂了,官方比较简单,而且不需要标志位,边界条件判断的很漂亮,我写的还是水平不行
代码(Go):
func isLongPressedName(name string, typed string) bool {
i,j := 0,0
flag := 1
for i < len(typed) && j < len(name){
if typed[i] == name[j]{
if j < len(name) - 1 &&i < len(typed) - 1 && typed[i + 1] == name[j + 1]{
j++
}
i++
flag = 0
}else if flag == 0{
j++
flag = 1
}else{
return false
}
}
if flag == 1 || j < len(name) - 1{
return false
}
return true
}
1078. Bigram 分词-简单
题目描述:
给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 “first second third” 形式出现的情况,其中 second 紧随 first 出现,third 紧随 second 出现。
对于每种这样的情况,将第三个词 “third” 添加到答案中,并返回答案。
题解:
按空格分割字符串后进行比对,若两个单词分别相等且存在第三个单词就将其加入结果数组
代码(Go):
func findOcurrences(text string, first string, second string) []string {
sce := strings.Split(text," ")
re := []string{}
for i := 0;i < len(sce);i++{
if sce[i] == first && i + 1 < len(sce) && sce[i + 1] == second{
if i + 2 < len(sce){
re = append(re,sce[i + 2])
}
}
}
return re
}
1605. 给定行和列的和求可行矩阵-中等
题目描述:
给你两个非负整数数组 rowSum 和 colSum ,其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和。换言之你不知道矩阵里的每个元素,但是你知道每一行和每一列的和。
请找到大小为 rowSum.length x colSum.length 的任意 非负整数 矩阵,且该矩阵满足 rowSum 和 colSum 的要求。
请你返回任意一个满足题目要求的二维矩阵,题目保证存在 至少一个 可行矩阵。
题解:
核心思想其实就是尽量往大了填,一个格子同时受到横向和竖向的限制,就填这两个值里较小的那个,然后这一行或者列剩下的部分就可以不用管全填0就可以了,接着让行和列的和减掉这个值,较小的那个变为0后直接换到下一行或列,较大的那个拿去与下一行或列进行比较,重复这个过程就可以了,这里官方写的比较清楚
代码(Go):
func restoreMatrix(rowSum []int, colSum []int) [][]int {
n, m := len(rowSum), len(colSum)
matrix := make([][]int, n)
for i := range matrix {
matrix[i] = make([]int, m)
}
i, j := 0, 0
for i < n && j < m {
temp := min(rowSum[i], colSum[j])
matrix[i][j] = temp
rowSum[i] -= temp
colSum[j] -= temp
if rowSum[i] == 0 {
i++
}
if colSum[j] == 0 {
j++
}
}
return matrix
}
func min(x int, y int) int {
if x > y {
return y
}
return x
}
总结
今天被中等题干碎了,连续好几道中等题都没做出来,感觉状态不太好,几道题都是一看答案恍然大悟自己想的时候不知道为啥就没想出来,最后终于挑到一个软柿子做出来了