• LeetCode解题Golang(1-10)


    前言

    LeetCode题目个人答案(Golang版)

    本篇预期记录 1-10 题, 持续更新

    正文

    1.两数之和(简单)

    https://leetcode-cn.com/problems/two-sum/

    题目

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

    示例

    给定 nums = [2, 7, 11, 15], target = 9
    
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]
    

    解答

    package main
    
    /*
    URL: https://leetcode-cn.com/problems/two-sum/
    解题思路: 维护一个map,key为nums的值,value为该值的索引,
    	遍历一遍nums, 假设每个值为b, 算出a+b中a的值,
    	判断map存不存在, 如存在则获取到map中a的value(索引),
    	不存在则将b的值与索引加入map中,
    	有可能都不匹配,注意在遍历结束后返回一个空切片	
    */
    
    func twoSum(nums []int, target int) []int {
        sumMap := map[int]int{}
        for index, value := range nums{
            mapValue, ok := sumMap[target-value]
            if !ok{
                sumMap[value] = index
                continue
            }
            return []int{mapValue, index}
        }
        return []int{}
    }
    

    2.两数相加(中等)

    https://leetcode-cn.com/problems/add-two-numbers/

    题目

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807
    

    解答

    package main
    
    /*
    URL: https://leetcode-cn.com/problems/add-two-numbers/
    解题思路: 新建函数 addNode
    addNode 多接收一个参数为偏移值
    读取两个结构体的 val,相加,大于10则pre为1
    使用递归来层层读取调用 addNode
    */
    
    
    type ListNode struct {
    	Val  int
    	Next *ListNode
    }
    
    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    	return addNode(l1, l2, 0)
    }
    
    func addNode(l1 *ListNode, l2 *ListNode, pre int) *ListNode {
    	// 处理链表
    	if l1 == nil && l2 == nil{
    		if pre == 0{
    			return nil
    		}else {
    			return &ListNode{
    				Val:  pre,
    				Next: nil,
    			}
    		}
    	}
    	if l1 == nil{
    		l1 = &ListNode{
    			Val:  0,
    			Next: nil,
    		}
    	}
    	if l2 == nil{
    		l2= &ListNode{
    			Val:  0,
    			Next: nil,
    		}
    	}
    
    	count := l1.Val + l2.Val + pre  // 计算本次数据结果,pre为上一次计算满10进1
    	p := 0
    	if count >= 10{
    		p = 1
    		count = count - 10
    	}
    	node := &ListNode{
    		Val: count,
    		Next: addNode(l1.Next, l2.Next, p),
    	}
    	return node
    }
    
    

    3.无重复字符的最长子串(中等)

    https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

    题目

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    示例

    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    
    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    
    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    

    解答

    package main
    
    /*
    URL: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
    滑块模式,维护一个map,存放当前滑块内的内容,
    滑块向前滑动,新的字符直接加入滑块
    老的字符先判断是否在滑块内,在则滑块起始为老的字符出现位置+1
    每次获取一下长度,如果大于已保存的最大长度则最大长度+1
    */
    
    func lengthOfLongestSubstring(s string) int {
    	var ins = make(map[int32]int, len(s))  // 建立存放已出现字符的map,key为该字符,value为下标
    	max := 0  // 最大值
    	startIndex := 0  // 起点下标
    	for index, value := range s {
    		// 遍历字符串
    		oldIndex, ok := ins[value]  // 判断字符是否已经出现过
    		ins[value] = index  // 如出现过将map字符下标替换成新的,未出现过新增
    		if ok && startIndex <= oldIndex {  // 如果之前出现过且老的下标在起点下标之内,代表之前虽然有出现过且在·滑动窗口内
    			startIndex = oldIndex + 1  // 将起点下标向前偏移一位,去除重复字符
    		}
    		if (index - startIndex + 1) > max {  // 判断现在的长度是否超过记录的最大长度
    			max = index - startIndex + 1  // 更新最大长度
    		}
    	}
    	return max
    }
    
    

    4. 寻找两个正序数组的中位数(困难)

    https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

    题目

    给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

    请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

    你可以假设 nums1 和 nums2 不会同时为空。

    示例

    nums1 = [1, 3]
    nums2 = [2]
    
    则中位数是 2.0
    
    nums1 = [1, 2]
    nums2 = [3, 4]
    
    则中位数是 (2 + 3)/2 = 2.5
    

    解答

    pass

    5.最长回文子串(中等)

    https://leetcode-cn.com/problems/longest-palindromic-substring/

    题目

    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000

    示例

    输入: "babad"
    输出: "bab"
    注意: "aba" 也是一个有效答案。
    
    输入: "cbbd"
    输出: "bb"
    

    解答

    package main
    
    /*
    URL: https://leetcode-cn.com/problems/longest-palindromic-substring/
    中心扩散法: 遍历目标字符串, 以当前字符为中心, 向两边扩散, 如一致则继续扩散, 比较找出最长的, 此为奇数扩散
    针对类似于 baa 这种情况, 连续两个相同的字符串, 在遍历时考虑将当前字符与下一个字符当作扩散的中心, 此为偶数扩散
    */
    
    func longestPalindrome(s string) string {
    	maxStr := ""
    	// 长度为0或1直接返回
    	if len(s) <= 1 {
    		return s
    	}
    	// 循环
    	for i := range s {
    		t := verify(s, i, i)
    		if len(t) > len(maxStr) {
    			maxStr = t
    		}
    		t = verify(s, i, i+1)
    		if len(t) > len(maxStr) {
    			maxStr = t
    		}
    	}
    	return maxStr
    }
    
    func verify(s string, l int, r int) string {
    	for {
    		if l >= 0 && r < len(s) && s[l] == s[r] {
    			l--
    			r++
    		} else {
    			// 如果匹配不上了, 返回上一个匹配成功的回文
    			// list包头不包尾, 所以 l+1 而 r 不包
    			return s[l+1 : r]
    		}
    	}
    }
    
    

    6.Z字形变换(中等)

    https://leetcode-cn.com/problems/zigzag-conversion/

    题目

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

    比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

    L   C   I   R
    E T O E S I I G
    E   D   H   N
    

    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

    请你实现这个将字符串进行指定行数变换的函数:

    string convert(string s, int numRows);

    示例

    输入: s = "LEETCODEISHIRING", numRows = 3
    输出: "LCIRETOESIIGEDHN"
    
    输入: s = "LEETCODEISHIRING", numRows = 4
    输出: "LDREOEIIECIHNTSG"
    解释:
    
    L     D     R
    E   O E   I I
    E C   I H   N
    T     S     G
    
    

    解答

    package main
    
    /*
    URL: https://leetcode-cn.com/problems/zigzag-conversion/
    解题思路: 我们把 Z 结构的中间的空格全部去掉, 会发现实际上是一个二维数组,
    每独取一个新的字符, 将其存储进当前数组, 再读取下一个字符存储进下一行数组,
    当触碰到行底时, 下一个字符存储进上一行直到行初再正序存储
    */
    
    func convert(s string, numRows int) string {
    	if numRows == 1 {
    		return s
    	}
    	var resList = make([][]string, numRows)
    	res := ""
    	rowIndex := 0
    	flag := 1
    	for _, v := range s {
    		resList[rowIndex] = append(resList[rowIndex], string(v))
    		switch rowIndex {
    		case numRows - 1:
    			flag = -1
    		case 0:
    			flag = 1
    		}
    		rowIndex = rowIndex + flag
    	}
    
    	for _, v := range resList {
    		for _, k := range v {
    			res = res + k
    		}
    	}
    	return res
    }
    
    

    7.整数反转(简单)

    https://leetcode-cn.com/problems/reverse-integer/

    题目

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

    示例

    输入: 123
    输出: 321
    
    输入: -123
    输出: -321
    
    输入: -123
    输出: -321
    

    解答

    package main
    
    import "math"
    
    /*
    URL: https://leetcode-cn.com/problems/reverse-integer/
    首先我们可以使用 math 包下的变量来判断是否超限
    反转方面使用求余+取模计算即可
    */
    
    func reverse(x int) int {
    	if x < math.MinInt32 || x > math.MaxInt32 {
    		return 0
    	}
    	res := 0
    	for x != 0 {
    		temp := x % 10
    		x = x / 10
    		res = res*10 + temp
    		if res < math.MinInt32 || res > math.MaxInt32 {
    			return 0
    		}
    	}
    	return res
    }
    
    
  • 相关阅读:
    DDD:再谈:实体能否处于非法状态?
    EntityFramework:迁移工具入门
    技术人生:态度决定人生
    EntityFramework:EF Migrations Command Reference
    DDD:聊天笔记
    DCI:DCI学习总结
    DCI:The DCI Architecture: A New Vision of Object-Oriented Programming
    设计原则:消除Switch...Case的过程,可能有点过度设计了。
    .NET:动态代理的 “5 + 1” 模式
    Silverlight:《Pro Silverlight5》读书笔记 之 Dependency Properties And Routed Event
  • 原文地址:https://www.cnblogs.com/chnmig/p/13522466.html
Copyright © 2020-2023  润新知