两数之和
题目要求:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
func twoSum(nums []int, target int) []int {
var a int = len(nums)
var i int = 0
var ans = []int{}
for i < a {
var j = 0
for j < i {
//fmt.Print(i, j, nums[i]+nums[j])
if nums[i]+nums[j] == target {
ans = append(ans, j)
ans = append(ans, i)
return ans
}
j++
}
i++
}
if ans[0] == 0 && ans[1] == 0 {
return []int{}
}
return ans
}
题目很简单,就不描述写法了,从这一段代码中我们可以学到如下语法
- 定义一个可扩展的列表,加入新数据
var ans = []int{}
ans = append(ans,j)
- 循环
for j < i {
//fmt.Print(i, j, nums[i]+nums[j])
if nums[i]+nums[j] == target {
ans = append(ans, j)
ans = append(ans, i)
return ans
}
j++
}
- 打印语句
fmt.Print(i, j, nums[i]+nums[j])
- 条件判断语句
if nums[i]+nums[j] == target {
ans = append(ans, j)
ans = append(ans, i)
return ans
}
主要元素
题目描述:数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
func majorityElement(nums []int) int {
var n = len(nums)
var i = 0
var tmp = map[int]int{}
for i < n {
tmp[nums[i]]++
if tmp[nums[i]]*2 > n {
return nums[i]
}
i++
}
return -1
}
- 集合Map
var tmp = map[int]int{}
tmp[nums[i]]++
消失的数字
题目描述:数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗
func missingNumber(nums []int) int {
sort.Ints(nums)
var n = len(nums)
if nums[0] != 0 {
return 0;
}
var i = 1
for i <= n {
if i == n {
if i != nums[i-1] {
return i
}
i++
continue
}
if i != nums[i] {
return i
}
i++
}
return 0
}
- 排序函数
- 对int数组进行排序
sort.Ints(nums)
验证回文串
题目描述:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
func isPalindrome(s string) bool {
s = strings.ToLower(s)
var x string = ""
var n = len(s)
for i := 0; i < n; i++ {
switch s[i] {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g','h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z':
x = x + string(s[i])
break
default:
break
}
}
//fmt.Println(x)
var m = len(x)
for i := 0; i < m; i++ {
if x[i] != x[m-i-1] {
return false
}
}
return true
}
- switch方法
switch s[i] {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g','h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z':
x = x + string(s[i])
break
default:
break
}
- 循环
for i := 0; i < m; i++ {
if x[i] != x[m-i-1] {
return false
}
}
- 字符串处理函数
s = strings.ToLower(s)
只出现一次的数字
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
func singleNumber(nums []int) int {
var n = len(nums)
sort.Ints(nums)
for i := 0; i < n; i++ {
if i == 0 {
if i+1 < n {
if nums[i] != nums[i+1] {
return nums[i]
}
} else {
return nums[i]
}
} else if i == n-1 {
if i-1 >= 0 {
if nums[i] != nums[i-1] {
return nums[i]
}
} else {
return nums[i]
}
} else {
if i-1 >= 0 && i+1 < n {
if nums[i] != nums[i-1] && nums[i] != nums[i+1] {
return nums[i]
}
}else {
if i-1 >= 0 {
if nums[i]!=nums[i-1] {
return nums[i]
}
}
if i+1 <n {
if nums[i]!=nums[i+1] {
return nums[i]
}
}
}
}
}
return 0
}
这道题没有新的知识点。
最后以一道有点思考逻辑的题目收尾
Excel表列名称
题目描述:给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。
func convertToTitle(columnNumber int) string {
var x = ""
var tmp = map[int]string{}
for i := 1; i <= 26; i++ {
tmp[i] = string(rune('A' + i - 1))
}
for ; ; {
if columnNumber == 0 {
break
}
var y = columnNumber % 26
if y != 0 {
x = tmp[y] + x
columnNumber /= 26
}else {
// todo 如果整除了需要向前借一
x = "Z" + x
columnNumber -= 26
columnNumber /= 26
}
}
return x
}
- 取模
var y = columnNumber % 26
- 支持连续的赋值符号
columnNumber -= 26
columnNumber /= 26
刷题不是目的,只是为了锻炼自己对GO语言的熟悉程度,我还是喜欢用Java写算法,因为熟悉程度高一些。