从零开始的力扣刷题记录-第四十八天

2460. 对数组执行操作-简单

给你一个下标从 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
}

2363. 合并相似的物品-简单

题目描述:
给你两个二维整数数组 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
}

1408. 数组中的字符串匹配-简单

题目描述:
给你一个字符串数组 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
}

92. 反转链表 II-中等

题目描述:
给你单链表的头指针 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
}

总结

又是比较顺利的一天,没有什么难题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值