LeetCode: 3.Longest Substring Without Repeating Characters

tags: LeetCode 准备 动态规划 实践 字符串 “abcabcbb” 根据索引有如下关系 a b c a b c b b 0 1 2 3 4 5 6 7 \(f(0,1)=f(0,0) + 1\) \(f(0,2)=f(0,1) + 2\) 在所有字符都不重复的情况下有如下公式 \(f(s,e)=f(s,e-1) + e\) 若遇到重复的情况则,3 索引于当前字串 的 0 重复则表明当前字串已经到头,需要记录并偏移 s,s=1: \(f(1,3)=f(1,2)+3\) 假设: s - 开始字符索引 e - 结束字符索引 若遇到当前字符于前面 r 字符重复则: \[ f(r,e)=f(s,e - 1) + e; s=r \] 解法 func lengthOfLongestSubstring(s string) int { if len(s) == 0 { return 0 } appearedIndexes := [256]int{} for i := 0; i < 256; i++{ appearedIndexes[i] = -1 } longest, start, end := 0, 0, 0 b := []byte(s) for cIndex, c := range b { index := int(c) appearedIndex := appearedIndexes[index] end = cIndex // 出现过需要截断 if appearedIndex != -1 { // 重置已出现的字符 for i := start; i <= appearedIndex; i++{ appearedIndexes[b[i]] = -1 } length := end - start if length > longest { longest = length } start = appearedIndex+1 } appearedIndexes[index] = cIndex } if end - start + 1 > longest { longest = end - start + 1 } return longest }

April 23, 2019 · 1 min · Gray King

LeetCode: 4.Median of Two Sorted Arrays

tags: LeetCode 思路 归并排序 代码 func findMedianSortedArrays(nums1 []int, nums2 []int) float64 { nums := mergeSort(nums1, nums2) length := len(nums) if length % 2 != 0 { return float64(nums[(length - 1) / 2]) } i := length / 2 return (float64(nums[i]) + float64(nums[i - 1])) / 2 } func mergeSort(nums1 []int, nums2 []int) []int { l1 := len(nums1) l2 := len(nums2) result := make([]int, 0, l1 + l2) i, j := 0, 0 for i < l1 && j < l2 { if nums1[i] < nums2[j] { result = append(result, nums1[i]) i++ } else { result = append(result, nums2[j]) j++ } } result = append(result, nums1[i:]...) result = append(result, nums2[j:]...) return result }

April 23, 2019 · 1 min · Gray King

LeetCode: 5.Longest Palindromic Substring

tags: LeetCode > https://leetcode.com/problems/longest-palindromic-substring/description/ 思路 直接暴力往两边搜索 func longestPalindrome(s string) string { buf := []byte(s) length := len(buf) if length == 0 { return s } start, end := 0, 0 for ci, _ := range buf { i, j := ci, ci // 无法处理 "aaaa" 和 "noon" 这种情况 for i > 0 && j < length - 1 && buf[i - 1] == buf[j + 1] { i-- j++ } // 考虑 "bba" 这种情况 if i == j && ci > 0 && buf[ci] == buf[ci - 1] { i, j = ci-1, ci } // 考虑 "abb" 这种情况 if i == j && ci < length - 1 && buf[ci] == buf[ci + 1] { i, j = ci, ci + 1 } if i != j && j - i >= end - start { start, end = i, j } } return string(buf[start:end + 1]) } 上面代码无法处理 “aaaa” 和 “noon” 这种情况,只要把下面处理 “bba” 和 “abb” 情况的代码放到上面即可 ...

April 23, 2019 · 3 min · Gray King

LeetCode: 6.ZigZag Conversion

tags: LeetCode srouce: https://leetcode.com/problems/zigzag-conversion/description/ 先根据行数计算列数: \(column=length / (row + 2) + bool(length \mod (row + 2))\) 每一行必然有点的位置为: \(i \mod (row - 1)\) 为 0

April 23, 2019 · 1 min · Gray King

MySQL

April 23, 2019 · 0 min · Gray King

《The Rust Programming Language》读书笔记

tags: 读书笔记,Rust 语句和表达式 所有权 引用和借用 结构体 枚举 模式匹配 if let 模块化 错误处理 Traits 生命周期 闭包 迭代器 智能指针 Rust 宏 Rust 并发 函数指针 fn 区分闭包的 Fn 特性,函数指针都实现来三个闭包的特性。 fn do(f: fn(i32) -> i32, arg: i32) -> i32 { f(arg) + f(arg) }

April 9, 2019 · 1 min · Gray King