Golang leetcode刷题记录
最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
个人思路:使用标准库函数
- 使用strings.Trim去除字符串前后的空格
- 使用strings.Split将字符串按照空格分为单词数组
- 获得数组中最后一个元素的长度
func lengthOfLastWord(s string) int {
s = strings.Trim(s, " ")
slice := strings.Split(s, " ")
return len(slice[len(slice)-1])
}
2 的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
个人思路:
- n为非正数时为false
- n>1是循环,查看n除以2的余数是否为0,如果不为0,返回false
- 最后返回true,就是n=1的情况
func isPowerOfTwo(n int) bool {
if n <= 0 {
return false
}
for n > 1 {
if n%2 != 0 {
return false
}
n = n / 2
}
return true
}
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
个人思路:
- 循环遍历数组,当遇到数组中元素的值和target相等时,直接返回index索引
- 如果没遇到相等,就判断当前元素的值是否小于target,下个索引的值是否大于target.如果是,那么target就应该插入在这里。那么target的索引值就是index+1
func searchInsert(nums []int, target int) int {
result := 0
for index, item := range nums {
if item == target {
result = index
}
if item < target && (index == len(nums)-1 || nums[index+1] > target) {
result = index + 1
}
}
return result
}
存在重复元素
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
个人思路:
- 新建映射保存每个元素出现的次数
- 循环遍历nums,出现的每个元素的键值都+1
- 循环遍历保存出现次数的映射,如果某个元素的键值>=2,即出现次数大于等于2,返回true。否则返回false
func containsDuplicate(nums []int) bool {
result := make(map[int]int)
for _, item := range nums {
result[item] += 1
}
for _, item := range result {
if item >= 2 {
return true
}
}
return false
}
多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
个人思路:
- 建立空的映射,保存每个元素出现的次数
- 循环遍历,更新映射为元素出现的次数
- 循环遍历映射,如果某个元素出现的次数>n/2,返回
func majorityElement(nums []int) int {
n:=len(nums)
result := make(map[int]int)
for _, item := range nums {
result[item] += 1
}
num := 0
for index, item := range result {
if item > n/2 {
num = index
}
}
return num
}