给你一个下标从 0 开始的数组 nums ,数组大小为 n ,且由 非负 整数组成。
你需要对数组执行 n - 1 步操作,其中第 i 步操作(从 0 开始计数)要求对 nums 中第 i 个元素执行下述指令:
如果 nums[i] == nums[i + 1] ,则 nums[i] 的值变成原来的 2 倍,nums[i + 1] 的值变成 0 。否则,跳过这步操作。
在执行完 全部 操作后,将所有 0 移动 到数组的 末尾 。
例如,数组 [1,0,2,0,0,1] 将所有 0 移动到末尾后变为 [1,2,1,0,0,0] 。
返回结果数组。
注意 操作应当 依次有序 执行,而不是一次性全部执行。
题解:
跟着题目描述一步一步做就可以了,没难度
代码(Go):
func applyOperations(nums []int) []int {
for i := 0;i < len(nums) - 1;i++{
if nums[i] == nums[i + 1]{
nums[i] = nums[i] * 2
nums[i + 1] = 0
}
}
p := 0
for i := 0;i < len(nums);i++{
if nums[i] != 0{
temp := nums[p]
nums[p] = nums[i]
nums[i] = temp
p++
}
}
return nums
}
题目描述:
给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质:
items[i] = [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。
items 中每件物品的价值都是 唯一的 。
请你返回一个二维数组 ret,其中 ret[i] = [valuei, weighti], weighti 是所有价值为 valuei 物品的 重量之和 。
注意:ret 应该按价值 升序 排序后返回。
题解:
思想就是哈希表,但是因为哈希表无序且价值上限是1000,所以采用了计数排序的思想用一个长度是1000的数组保存重量,然后遍历此数组取出重量相加后的结果
代码(Go):
func mergeSimilarItems(items1 [][]int, items2 [][]int) [][]int {
arr := [1001]int{}
for _,v := range items1{
arr[v[0]] += v[1]
}
for _,v := range items2{
arr[v[0]] += v[1]
}
sce := [][]int{}
for i,v := range arr{
if v != 0{
scei := make([]int,2)
scei[0] = i
scei[1] = v
sce = append(sce,scei)
}
}
return sce
}
题目描述:
给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。
如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 words[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。
题解:
只会暴力,本来以为不行,没想到官方题解也只有暴力,看评论有大佬用超级长的代码降低了时间复杂度,估计因为这题是简单题所以官方就没给优化的算法
代码(Go):
func stringMatching(words []string) (ans []string) {
for i, x := range words {
for j, y := range words {
if j != i && strings.Contains(y, x) {
ans = append(ans, x)
break
}
}
}
return
}
题目描述:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
题解:
反转之后再将需要反转的子链表和前后连接起来,用一个变量记录子链表的前连接点,三个变量用于反转链表。官方题解在一次遍历中边遍历边进行头插法插节点,可以少遍历一次链表,速度更快
代码(Go):
func reverseBetween(head *ListNode, left int, right int) *ListNode {
if head.Next == nil || left == right{
return head
}
p,r,l := head,head,head
q := p.Next
for i := 0;i < left - 1;i++{
p = p.Next
q = q.Next
}
for i := 0;i < right - 1;i++{
r = r.Next
}
p.Next = r.Next
r.Next = nil
for q.Next != nil{
r = q.Next
q.Next = p
p = q
q = r
r = r.Next
}
q.Next = p
if left > 1{
for i := 0;i < left - 2;i++{
l = l.Next
}
l.Next = q
}else{
head = q
}
return head
}
又是比较顺利的一天,没有什么难题