剑指 Offer 58 - II. 左旋转字符串-简单
题目描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
题解:
这题方法可太多了,最简单的就是切片,不过还是给出一个麻烦点的通解
代码(Go):
func reverseLeftWords(s string, n int) string {
var re string
for i := n;i < len(s);i++{
re = re + string(s[i])
}
for i := 0;i < n;i++{
re = re + string(s[i])
}
return re
}
441.排列硬币-简单
题目描述:
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。
给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
题解:
太简单导致大意了,直接暴力解了,看答案才想到还可以用二分查找和数学方法简化
代码(Go):
func arrangeCoins(n int) int {
re := 0
for i := 1;n - i >= 0;i++{
re = i
n -= i
}
return re
}
605.种花问题-简单
题目描述:
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。
题解:
遇到连续的3个0就说明可以种一朵花,此时将0的个数置1,因为只需要再遇到两个连续的0就可种一朵花,遇到1时将0的个数置0.开始时将0的个数置1。最后还需要检查一下0的数量,若此时为2则还可以再种一朵。
代码(Go):
func canPlaceFlowers(flowerbed []int, n int) bool {
temp := 1
for _,v := range flowerbed{
if v == 0{
temp++
}
if temp == 3{
n--
temp = 1
}
if n == 0{
return true
}
if v == 1{
temp = 0
}
}
if temp == 2 && n == 1{
return true
}
return false
}
128.最长连续序列-中等
题目描述:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
题解:
排序后一次遍历即可找到最长连续序列,时间复杂度O(nlogn)。官方题解使用了哈希表,不需要排序,通过一次遍历加入哈希表再查找哈希表中值是否存在前序值,不存在时循环查找其后序值,通过此方法可以使每个值仅被遍历一次,达到O(n)的时间复杂度
代码(Go):
func longestConsecutive(nums []int) int {
if len(nums) == 0{
return 0
}
if len(nums) == 1{
return 1
}
sort.Ints(nums)
flag := 0
temp,max := 1,1
for i := 1;i < len(nums);i++{
if nums[i] == nums[flag] + 1{
flag++
temp++
}else if nums[i] == nums[flag]{
flag++
}else{
flag = i
if temp > max{
max = temp
}
temp = 1
}
}
if temp > max{
max = temp
}
return max
}
总结
最近中等题居然异常的顺利,虽然不一定能想到时间复杂度最低的解法,但都能做出来,大进步