Golang每日一练(leetDay0059) 两数之和II、Excel表列名称

简介: Golang每日一练(leetDay0059) 两数之和II、Excel表列名称

167. 两数之和 II 输入有序数组 Two-sum-ii-input-array-is-sorted


给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。


以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。


你所设计的解决方案必须只使用常量级的额外空间。


示例 1:

输入:numbers = [2,7,11,15], target = 9

输出:[1,2]

解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。


示例 2:

输入:numbers = [2,3,4], target = 6

输出:[1,3]

解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。


示例 3:

输入:numbers = [-1,0], target = -1

输出:[1,2]

解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。


提示:

   2 <= numbers.length <= 3 * 10^4

   -1000 <= numbers[i] <= 1000

   numbers 按 非递减顺序 排列

   -1000 <= target <= 1000

   仅存在一个有效答案


代码1: 双指针

package main
import "fmt"
func twoSum(numbers []int, target int) []int {
  i, j := 0, len(numbers)-1
  for i < j {
    sum := numbers[i] + numbers[j]
    if sum == target {
      return []int{i + 1, j + 1}
    } else if sum < target {
      i++
    } else {
      j--
    }
  }
  return []int{}
}
func main() {
  numbers := []int{2, 7, 11, 15}
  target := 9
  fmt.Println(twoSum(numbers, target))
  numbers = []int{2, 3, 4}
  target = 6
  fmt.Println(twoSum(numbers, target))
  numbers = []int{-1, 0}
  target = -1
  fmt.Println(twoSum(numbers, target))
}


代码2: 二分查找

package main
import "fmt"
func binarySearch(numbers []int, target, left int) int {
  right := len(numbers) - 1
  for left <= right {
    mid := (left + right) / 2
    if numbers[mid] == target {
      return mid
    } else if numbers[mid] > target {
      right = mid - 1
    } else {
      left = mid + 1
    }
  }
  return -1
}
func twoSum(numbers []int, target int) []int {
  for i, x := range numbers {
    j := binarySearch(numbers, target-x, i+1)
    if j != -1 {
      return []int{i + 1, j + 1}
    }
  }
  return []int{}
}
func main() {
  numbers := []int{2, 7, 11, 15}
  target := 9
  fmt.Println(twoSum(numbers, target))
  numbers = []int{2, 3, 4}
  target = 6
  fmt.Println(twoSum(numbers, target))
  numbers = []int{-1, 0}
  target = -1
  fmt.Println(twoSum(numbers, target))
}


代码3: 哈希表

package main
import "fmt"
func twoSum(numbers []int, target int) []int {
  index := make(map[int]int)
  for i, x := range numbers {
    if j, ok := index[target-x]; ok {
      return []int{j + 1, i + 1}
    }
    index[x] = i
  }
  return []int{}
}
func main() {
  numbers := []int{2, 7, 11, 15}
  target := 9
  fmt.Println(twoSum(numbers, target))
  numbers = []int{2, 3, 4}
  target = 6
  fmt.Println(twoSum(numbers, target))
  numbers = []int{-1, 0}
  target = -1
  fmt.Println(twoSum(numbers, target))
}

输出:

[1 2]

[1 3]

[1 2]


168. Excel表列名称 Excel Sheet Column Title


给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。


例如:

A -> 1

B -> 2

C -> 3

...

Z -> 26

AA -> 27

AB -> 28  

...


示例 1:

输入:columnNumber = 1

输出:"A"


示例 2:

输入:columnNumber = 28

输出:"AB"


示例 3:

输入:columnNumber = 701

输出:"ZY"


示例 4:

输入:columnNumber = 2147483647

输出:"FXSHRXW"


提示:

   1 <= columnNumber <= 2^31 - 1

代码1: 递归

package main
import "fmt"
func convertToTitle(columnNumber int) string {
  if columnNumber <= 26 {
    return string('A' + columnNumber - 1)
  }
  mod := (columnNumber - 1) % 26
  return convertToTitle((columnNumber-1)/26) + string('A'+mod)
}
func main() {
  fmt.Println(convertToTitle(1))
  fmt.Println(convertToTitle(28))
  fmt.Println(convertToTitle(701))
  fmt.Println(convertToTitle(2147483647))
}


代码2:迭代

package main
import "fmt"
func convertToTitle(columnNumber int) string {
  ans := ""
  for columnNumber > 0 {
    mod := (columnNumber - 1) % 26
    ans = string('A'+mod) + ans
    columnNumber = (columnNumber - 1) / 26
  }
  return ans
}
func main() {
  fmt.Println(convertToTitle(1))
  fmt.Println(convertToTitle(28))
  fmt.Println(convertToTitle(701))
  fmt.Println(convertToTitle(2147483647))
}


输出:

A

AB

ZY

FXSHRXW

目录
相关文章
|
存储 算法 数据挖掘
深入解析力扣168题:Excel表列名称(进制转换法详解及模拟面试问答)
深入解析力扣168题:Excel表列名称(进制转换法详解及模拟面试问答)
|
算法 数据挖掘 大数据
深入解析力扣171题:Excel表列序号(进制转换法详解及模拟面试问答)
深入解析力扣171题:Excel表列序号(进制转换法详解及模拟面试问答)
【力扣】168. Excel表列名称、171. Excel 表列序号
【力扣】168. Excel表列名称、171. Excel 表列序号
197 1
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
195 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
173 0
Linux 终端命令之文件浏览(2) more
|
Java
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
171 1
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
633 4
Golang语言之管道channel快速入门篇
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
241 4
Golang语言文件操作快速入门篇
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
528 3
Golang语言之gRPC程序设计示例