从零开始的力扣刷题记录-第七十九天

796. 旋转字符串-简单

题目描述:
给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。
s 的 旋转操作 就是将 s 最左边的字符移动到最右边。
例如, 若 s = ‘abcde’,在旋转一次之后结果就是’bcdea’ 。

题解:
s+s拼接之后查看是否是子字符串即可

代码(Go):

func rotateString(s, goal string) bool {
    return len(s) == len(goal) && strings.Contains(s + s, goal)
}

266. 回文排列-简单

题目描述:
给定一个字符串,判断该字符串中是否可以通过重新排列组合,形成一个回文字符串。

题解:
哈希表判断各字符出现次数,只允许有一个字符出现次数为奇数

代码(Go):

func canPermutePalindrome(s string) bool {
    dict := map[rune]int{}
    for _,v := range s{
        dict[v]++
    }
    flag := 1
    for _,v := range dict{
        if v%2 == 1 && flag == 1{
            flag = 0
        }else if v%2 == 1 && flag == 0{
            return false
        }
    }
    return true
}

2178. 拆分成最多数目的正偶数之和-中等

题目描述:
给你一个整数 finalSum 。请你将它拆分成若干个 互不相同 的正偶数之和,且拆分出来的正偶数数目 最多 。
比方说,给你 finalSum = 12 ,那么这些拆分是 符合要求 的(互不相同的正偶数且和为 finalSum):(2 + 10) ,(2 + 4 + 6) 和 (4 + 8) 。它们中,(2 + 4 + 6) 包含最多数目的整数。注意 finalSum 不能拆分成 (2 + 2 + 4 + 4) ,因为拆分出来的整数必须互不相同。
请你返回一个整数数组,表示将整数拆分成 最多 数目的正偶数数组。如果没有办法将 finalSum 进行拆分,请你返回一个 空 数组。你可以按 任意 顺序返回这些整数。

题解:
这题的思路很简单,就是尽可能的选择小的偶数加进结果集,由于不能重复,一定可以保证得到的是拆分最多的结果,只需要拆分到剩余值小于选择的偶数,就把剩余值全部加在最后选择的偶数上即可

代码(Go):

func maximumEvenSplit(finalSum int64) []int64 {
    re := []int64{}
    if finalSum % 2 == 1 {
        return re
    }
    for i := int64(2);i <= finalSum;i += 2 {
        re = append(re, i)
        finalSum -= i
    }
    re[len(re) - 1] += finalSum
    return re
}

142. 环形链表 II-中等

题目描述:
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。

题解:
通过快慢指针可以找到环的长度,再用一个新指针提前移动环长度的距离,最后让头指针与这个新指针同时移动,它们相遇的节点就是环的起点

代码(Go):

func detectCycle(head *ListNode) *ListNode {
    if head == nil || head.Next == nil || head.Next.Next == nil{
        return nil
    }
    fast,slow := head.Next.Next,head.Next
    num := 1
    for fast != slow && fast != nil{
        fast = fast.Next
        if fast == nil{
            return nil
        }else{
            fast = fast.Next
        }
        slow = slow.Next
        num++
    }
    if fast != slow{
        return nil
    }
    p,q := head,head
    for num > 0{
        q = q.Next
        num--
    }
    for q != p{
        q = q.Next
        p = p.Next
    }
    return p
}

总结

动态规划做不动了,先做点其他的缓一缓

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值