From a5552c4d124b0c6d4230a033a6466ce05e42cbba Mon Sep 17 00:00:00 2001 From: gameloader Date: Sat, 2 Mar 2024 13:14:22 +0800 Subject: [PATCH] add leetcode content --- content/posts/leetcode.md | 76 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/content/posts/leetcode.md b/content/posts/leetcode.md index 480de0a..af4c4f9 100644 --- a/content/posts/leetcode.md +++ b/content/posts/leetcode.md @@ -265,3 +265,79 @@ func maximumOddBinaryNumber(s string) string { ### 总结 在处理字符串的时候像中间某个位置插入字符也要使用双引号, 如插入字符0要用`+"0"`而不是`+'0'`, 此外在截取切片的时候go的切片是左闭右开的. 如[0:3]截取的是0,1,2三个数 + +## day5 2024-03-02 + +### 977. Squares of a Sorted Array + +Given an integer array nums sorted in non-decreasing order, return an array of the squares of each number sorted in non-decreasing order. + +Example 1: + +Input: nums = [-4,-1,0,3,10] +Output: [0,1,9,16,100] +Explanation: After squaring, the array becomes [16,1,0,9,100]. +After sorting, it becomes [0,1,9,16,100]. + +Example 2: + +Input: nums = [-7,-3,2,3,11] +Output: [4,9,9,49,121] + +### 题解 + +考虑原数组已经按照非递减排序的情况下, 找到数组中正负交界处元素, 即数组中第一个正数, 以该位置作为起始位置, 使用双指针法, 分别向前和向后遍历数组, 遍历时不断比较两个指针指向的数字的绝对值大小, 将绝对值小的数字平方后追加到结果数组的尾部, 遍历完成即可完成平方值排序. 这样只需要遍历一遍数组即可完成排序. + +### 代码 + +```go +func sortedSquares(nums []int) []int { + index := 0 + value := nums[0] + var result []int + for index, value = range nums{ + if(value >= 0){ + break + } + } + backward := index - 1 + forward := index + if index != 0{ + for _,_ = range nums{ + if backward<0{ + result = append(result, nums[forward]*nums[forward]) + forward++ + } else if forward>= len(nums){ + result = append(result, nums[backward] * nums[backward]) + backward-- + } else{ + if(abs(nums[forward]) < abs(nums[backward])){ + result = append(result, nums[forward]*nums[forward]) + forward++ + } else{ + result = append(result, nums[backward] * nums[backward]) + backward-- + } + } + } + }else{ + for _,_ = range nums{ + result = append(result, nums[forward]*nums[forward]) + forward++ + } + } + return result +} + +func abs(val int) int { + if(val < 0){ + return -val + }else{ + return val + } +} +``` + +### 总结 + +注意一个go的语法问题, 如果在for range循环中两个变量都使用匿名变量, 则应该使用赋值运算符而不是创建并赋值运算符, 即`for _,_ = range slice` 而不是`for _,_ := range slice`. 这很可能是因为匿名变量默认为已经创建好的变量, 不需要再创建匿名变量本身了.