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

力扣每日四题

  • 58.最后一个单词的长度-简单
  • 463. 岛屿的周长-简单
  • 226.翻转二叉树-简单
  • 200.岛屿数量-中等
  • 总结

58.最后一个单词的长度-简单

题目描述:
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

题解:
遍历字符串寻找最后一个单词并记录长度就好了,可以用temp记录单词长度并传递给re,遇到空格将temp清零,避免了将re错误清零。看官方题解直接反向遍历就行了,搞复杂了

代码(Go):

func lengthOfLastWord(s string) int {
    re := 0
    temp := 0
    for _,v := range s{
        if v != ' '{
            temp++
            re = temp
        }else{
            temp = 0
        }
    }
    return re
}

463. 岛屿的周长-简单

题目描述:
给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。
网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

题解:
实际上只需要看一块陆地的相邻格子是否是水域就可以了,是水域就是边,当然也可以反过来想,一块陆地最多有4个边,每有一个相邻格子是陆地就减去一条边

代码(Go):

func islandPerimeter(grid [][]int) int {
    length := 0
    for i := 0;i < len(grid);i++{
        for j := 0;j < len(grid[0]);j++{
            if grid[i][j] == 1{
                temp := 4
                if i - 1 >= 0{
                    if grid[i - 1][j] == 1{
                        temp--
                    }
                }
                if j - 1 >= 0{
                    if grid[i][j - 1] == 1{
                        temp--
                    }
                }
                if i + 1 < len(grid){
                    if grid[i + 1][j] == 1{
                        temp--
                    }
                }
                if j + 1 < len(grid[0]){
                    if grid[i][j + 1] == 1{
                        temp--
                    }
                }
                length += temp
            }
        }
    }
    return length
}

226.翻转二叉树-简单

题目描述:
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

题解:
常规的递归题。但是发现一个很有意思的事,我递归终止条件多写了一层代码长了点但是时间击败100%,看答案其实终止条件写一层就可以了,我试一下发现时间耗费一下就上去了,最后只击败14%。

代码(Go):

func invertTree(root *TreeNode) *TreeNode {
    if root == nil{
        return root
    }else if root.Left == nil && root.Right == nil{
        return root
    }
    temp := root.Right
    root.Right = root.Left
    root.Left = temp
    root.Left = invertTree(root.Left)
    root.Right = invertTree(root.Right)
    return root
}

200.岛屿数量-中等

题目描述:
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

题解:
之前岛屿周长的加强版,之前那道题只需要查看每个陆地周围是不是陆地,而现在不仅要查看每个陆地周围,如果周围是陆地的话还要继续递归的判断周围还有没有连接的陆地,并且要对这些陆地进行标记,每次递归判断都能标记一片岛屿,统计递归次数即可

代码(Go):

func numIslands(grid [][]byte) int {
    num := 0
    for i := 0;i < len(grid);i++{
        for j := 0;j < len(grid[0]);j++{
           if grid[i][j] == '1'{
               num++
               grid = flag(grid,i,j)
           }
        }
    }
    return num
}

func flag(grid [][]byte,i int,j int) [][]byte{
    if i - 1 >= 0{
        if grid[i - 1][j] == '1'{
            grid[i - 1][j] = '2'
            grid = flag(grid,i - 1,j)
        }
    }
    if j - 1 >= 0{
        if grid[i][j - 1] == '1'{
            grid[i][j - 1] = '2'
            grid = flag(grid,i,j - 1)
        }
    }
    if i + 1 < len(grid){
        if grid[i + 1][j] == '1'{
            grid[i + 1][j] = '2'
            grid = flag(grid,i + 1,j)
        }
    }
    if j + 1 < len(grid[0]){
        if grid[i][j + 1] == '1'{
            grid[i][j + 1] = '2'
            grid = flag(grid,i,j + 1)
        }
    }
    return grid
}

总结

比较顺利的一天,再接再厉

你可能感兴趣的:(leetcode刷题,leetcode,算法,golang)