字符串相加
func addStrings(num1 string, num2 string) string {
add := 0
ans := ""
for l, r := len(num1) - 1, len(num2) -1; l >= 0 || r >= 0 || add > 0; l, r = l-1, r-1 {
var x, y int
if l >= 0 {
x = int(num1[l] - '0')
}
if r >= 0 {
y = int(num2[r] - '0')
}
result := x + y + add
ans = strconv.Itoa(result%10) + ans
add = result / 10
}
return ans
}
反转数组
func rotate(nums []int, k int) {
revert(nums)
revert(nums[:k%len(nums)])
revert(nums[k%len(nums):])
}
func revert(nums []int) {
lu := len(nums) - 1
for i := 0; i < lu; i++ {
nums[i], nums[lu] = nums[lu], nums[i]
lu--
}
}
二分查找
func findMagicIndex(nums []int) int {
lu := len(nums)
if lu == 0 {
return -1
}
l, r := 0, lu - 1
return f(nums, l, r)
}
func f(nums[]int, l, r int) int {
if l > r {
return - 1
}
mid := l + (r - l)/2
la := f(nums, l, mid-1)
if nums[mid] == mid {
return mid
} else if la != -1 {
return la
}
return f(nums, mid+1, r)
}
长度最小的正数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
暴力法
func leastArr(nums []int, s int) int {
n := len(nums)
if n == 0 {
return 0
}
sum, ans := 0, math.MaxInt32
for i :=0; i < n; i++ {
sum := nums[i]
for j := i; j < n; i++ {
sum += num[j]
if sum >= s {
ans = min(ans, j-i+1)
break
}
}
}
if ans == math.MaxInt32 {
return 0
}
return ans
}
快慢指针:
func leastArr(nums []int, s int) int {
n := len(nums)
if n == 0 {
return 0
}
head, end, sum := 0,0,0
max := math.MaxInt32
for end < n {
sum += nums[end]
for start < end {
if sum >= s {
ans = min(ans, end-head+1)
sum -= nums[head]
head++
}
}
end++
}
if max == math.MaxInt32 {
return 0
}
return ans
}