从零开始的力扣刷题记录-第二十九天

434.字符串中的单词数-简单

题目描述:
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。

题解:
遍历字符串,用两个变量分别记录单词数和当前字符是否在单词中(与前面的字符之间无空格)

代码(Go):

func countSegments(s string) int {
    re := 0
    flag := 0
    for _,v := range s{
        if v != ' ' && flag == 0{
            re++
            flag = 1
        }else if v == ' '{
            flag = 0
        }
    }
    return re
}

剑指 Offer 54. 二叉搜索树的第k大节点-简单

题目描述:
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

题解:
中序遍历得到递增数组再输出第k大的数,属于暴力解法。官方题解使用了倒序中序遍历得到递减数组,并且增加了找到第k大的节点就终止递归的条件,速度更快一些。

代码(Go):

func kthLargest(root *TreeNode, k int) int {
    sce := []int{}
    sce = fs(root,sce)
    return sce[len(sce) - k]
}

func fs(root *TreeNode,sce []int)[]int{
    if root == nil{
        return sce
    }
    sce = fs(root.Left,sce)
    sce = append(sce,root.Val)
    sce = fs(root.Right,sce)
    return sce
}

342.4的幂-简单

题目描述:
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x

题解:
一眼位运算但是依然只会暴力解,感觉这种题像找规律题,都是用数学方法做。贴个官方题解,思路就是先用n&(n-1)判断是不是2的幂,同时如果是4的幂除以3的余数一定等于1

代码(Go):

//官方题解
func isPowerOfFour(n int) bool {
    return n > 0 && n&(n-1) == 0 && n%3 == 1
}

31.下一个排列-中等

题目描述:
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 nums ,找出 nums 的下一个排列。
必须 原地 修改,只允许使用额外常数空间。

题解:
官方写的题目描述烂的离谱,看了评论区老哥的翻译才知道是什么意思,实际上就是用当前数组中的数组组合出下一个比当前数组按顺序表示的数更大的数,比如123下一个更大的数就是132。要找到下一个更大的数明显需要从后向前遍历,尽可能只改变当前数的低位,所以可以从后向前遍历找到第一个比当前数更大的数,若没有找到则向前移动指针继续寻找。找到之后交换二者位置,然后对交换后改变的数后面的部分排序。我的解法忽略了后面的部分一定是降序的,采用了冒泡排序,因为是降序排序所以只需要反转即可,官方采用了双指针的方法,速度更快。

代码(Go):

func nextPermutation(nums []int)  {
    if len(nums) == 1{
        return
    }
    for i := len(nums) - 2;i >= 0;i--{
        for j := len(nums) - 1;j > i;j--{
            if nums[j] > nums[i]{
                temp := nums[j]
                nums[j] = nums[i]
                nums[i] = temp
                sort(nums,i)
                return
            }
        }
    }
    i,j := 0,len(nums) - 1;
    for i < j{
        temp := nums[j]
        nums[j] = nums[i]
        nums[i] = temp
        i++
        j--
    }
    return
}

func sort(nums []int,k int){
    for i := 0; i < len(nums) - k; i++ {
        for j := k + 1; j < len(nums) - i - 1; j++ {
            if nums[j] > nums[j + 1] {
                temp := nums[j]
                nums[j] = nums[j + 1]
                nums[j + 1] = temp
            }
        }
    }
    return
}

总结

一道位运算暴力解,一道树没有找到最优解,中等题差一点点做出最优解有点可惜。现在简单和中等题暴力解做题感觉没啥问题了,以后做题要好好想想能不能优化再动手了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值