go编码

go编码练习

func replaceSpace(s string) string{
    return strings.Replace(s," ","%200",-1)
}
func maxArea(height []int) int {
    left, right := 0, len(height)-1
    ans := 0
    for left < right {
        if height[left] < height[right] {
            ans = max(ans, height[left]*(right-left))
            left++
        } else {
            ans = max(ans, height[right]*(right-left))
            right--
        }
    }
    return ans
}
func hasCycle(head *ListNode) bool {
    slow, fast := head, head
    for fast != nil && fast.Next != nil {
        slow = slow.Next
        fast = fast.Next.Next
        if slow == fast {
            return true
        }
    }
    return false
}

func main() {
    var head *ListNode
    // create a cycle listNode
    // head -> 2 -> 3 -> 4 -> 5 -> head
    head = &ListNode{Val: 2}
    node2 := &ListNode{Val: 3}
    node3 := &ListNode{Val: 4}
    node4 := &ListNode{Val: 5}
    head.Next = node2
    node2.Next = node3
    node3.Next = node4
    node4.Next = node2
    fmt.Println(hasCycle(head))
}
func canJamp(arr []int) bool {
    mx := 0
    for i := 0; i < len(arr); i++ {
        if i > mx {
            return false
        }
        mx = max(mx, i+arr[i])
    }
    return true
}
// mergeTwoLists 函数用于将两个有序链表合并为一个新的有序链表。
// 参数 l1 和 l2 分别为两个有序链表的头节点。
// 返回值为合并后新链表的头节点。
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    // 创建一个虚拟头节点,用于简化边界条件的处理,最终返回 dummy.Next 作为合并后链表的头节点
    dummy := &ListNode{}
    // 如果链表 l1 为空,直接返回链表 l2
    if l1 == nil {
        return l2
    }
    // 如果链表 l2 为空,直接返回链表 l1
    if l2 == nil {
        return l1
    }
    // cur 指针用于遍历并构建合并后的链表,初始指向虚拟头节点
    cur := dummy
    // 当 l1 和 l2 都不为空时,比较它们当前节点的值
    for l1 != nil && l2 != nil {
        if l1.Val < l2.Val {
            // 如果 l1 当前节点的值小于 l2 当前节点的值,将 l1 当前节点接入合并后的链表
            cur.Next = l1
            // l1 指针后移一位
            l1 = l1.Next
        } else {
            // 否则,将 l2 当前节点接入合并后的链表
            cur.Next = l2
            // l2 指针后移一位
            l2 = l2.Next
        }
        // cur 指针后移一位,准备接入下一个节点
        cur = cur.Next
    }
    // 如果 l1 还有剩余节点,将 l1 剩余部分直接接入合并后的链表
    if l1 != nil {
        cur.Next = l1
    } else {
        // 否则,将 l2 剩余部分直接接入合并后的链表
        cur.Next = l2
    }
    // 返回虚拟头节点的下一个节点,即合并后链表的头节点
    return dummy.Next
}
func longestPalindrome(s string) string {
    n := len(s)
    //  dp[left][right]为true表示"从left到right的子串为回文串",false表示不是回文串
    dp := make([][]bool, n)
    for i := range dp {
        dp[i] = make([]bool, n)
    }
    start, end := 0, 0
    for i := 0; i < len(s); i++ {
        // 初始化二维数组,单个字符为回文串,所以定义dp[i][i] = true
        dp[i][i] = true
    }
    for right := 1; right < len(s); right++ {
        for left := 0; left < right; left++ {
            // dp[left][right] =
            //(s[right]==s[left] && (right-left==1 || dp[left+1][right-1])) ? true : false
            // s[right]==s[left] && (right-left==1)       情况一:bb 这种
            // s[right]==s[left] && dp[left+1][right-1]   情况二:bab
            // 如果我们已经知道 “bab” 是回文,那么很明显,“ababa” 一定是回文,因为它的左首字母和右尾字母是相同的。
            if s[right] == s[left] && (right-left == 1 || dp[left+1][right-1]) {
                dp[left][right] = true
                if right-left > end-start {
                    start = left
                    end = right
                }
            } else {
                dp[left][right] = false
            }
        }
    }
    return s[start : end-start+1]
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容