【Day12】力扣LeetCode刷题[788.旋转数字][200.岛屿数量][509. 斐波那契数]

简介: 了解LeetCode刷题[788.旋转数字][200.岛屿数量][509. 斐波那契数]。

刷题打卡,第十二天


题目一、788.旋转数字

题目二、200.岛屿数量

题目三、509. 斐波那契数


题目一、788.旋转数字


原题链接:788.旋转数字


题目描述:


我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X

不同的数。要求每位数字都要被旋转。

如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。

现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数?

/

示例:

输入: 10

输出: 4

解释:

在[1, 10]中有四个好数: 2, 5, 6, 9。

注意 1 和 10 不是好数, 因为他们在旋转之后不变。

/

提示:

N 的取值范围是 [1, 10000]。


解题思路:

题目给出1到N,要求从中找出好数的个数,那么我们肯定需要遍历从1到N个数;

每遍历到一个数,我们都需要获取这个数的个位数,十位数,百位数到前面的每位数字,从而通过每位数字来判断这个数是否为好数:

用sum来记录好数的个数;

定义一个标杆flag,默认为0,flag = 0 不是好数 ;最终flag = 1 是好数;

若出现3,4,7这样的旋转后已经不是一个数字位数,直接flag = 0,开始判断1到N中的下一个数;

若出现2,5,6,9这样旋转后为另一个数字的,flag暂时为1,若每位数字都判断完,flag依旧为1,说明是一个好数,sum+1;


提交代码:

class Solution {
    public int rotatedDigits(int n) {
        int sum = 0;               //记录好数的数量
        int flag = 0;              //标记是否为好数0为否,是为1
        for(int i = 1;i <= n; ++i){//遍历1到n寻找好数
            int curr = i;          //记录当前遍历到的数
            while(curr > 0){          
                int num = curr%10;       //获取每位数字
                //遇到旋转后无效到的数字,不是好数,遍历i的下一个数
                if(num == 3 || num == 4 || num == 7){
                    flag = 0;//为0,即不是好数
                    break;
                }
                //旋转后数字仍有效,且与原数字不同,说明是好数,sum+1
                else if(num == 2 ||num == 5 ||num == 6 ||num == 9){
                    flag = 1;//为1,可能是好数
                }
                curr /= 10;               //去掉最后一位数
            }
            if(flag == 1){//遍历完每位数字后,flag仍为1,是好数
                ++sum;    //记录加一
                flag = 0; //标杆恢复默认值0
            }
        }
        return sum;       //返回好数个数;
    }
}

提交结果:

微信图片_20221030151859.png

题目二、200.岛屿数量


原题链接:200.岛屿数量


题目描述:


给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

/

示例 1:

输入:grid = [

[“1”,“1”,“1”,“1”,“0”],

[“1”,“1”,“0”,“1”,“0”],

[“1”,“1”,“0”,“0”,“0”],

[“0”,“0”,“0”,“0”,“0”]

]

输出:1

/

示例 2:

输入:grid = [

[“1”,“1”,“0”,“0”,“0”],

[“1”,“1”,“0”,“0”,“0”],

[“0”,“0”,“1”,“0”,“0”],

[“0”,“0”,“0”,“1”,“1”]

]

输出:3

/

提示:


m == grid.length


n == grid[i].length


1 <= m, n <= 300


grid[i][j] 的值为 ‘0’ 或 ‘1’


解题思路:

题目要求输出二维网格中的岛屿数量,我们可以遍历所有网格,若是得到网格中的土地(数值为 1) ,记录的岛屿数量就加1;

同时运用深度优先搜索的思想,将处于同一个岛屿上,数值为1的土地遍历,将数值改为2,代表已经遍历过了的土地;

继续遍历下一个网格,如果是海水‘0’或者遍历过的土地‘2’就直接掉过,最终返回记录下来的岛屿数量即可。


提交代码:

class Solution {
    void DFS(char[][] grid,int sr,int sc){
        //下标sr,或sc越过网络界限,返回;
        //扫描的不是 未遍历的土地'1',返回;
        //用‘0’代表海,‘2’代表遍历过的土地
        if(sr < 0 || sc < 0 ||sr >= grid.length || sc >= grid[0].length
           || grid[sr][sc] != '1'){
               return;
        }
        grid[sr][sc] = '2';//记录遍历过的土地,记录为字符'2'
        //遍历土地在网格中上下左右方向的格子
        DFS(grid,sr+1,sc);
        DFS(grid,sr-1,sc);
        DFS(grid,sr,sc+1);
        DFS(grid,sr,sc-1);
    }
    public int numIslands(char[][] grid) {
        int sum = 0;//用于记录岛屿数量
        for(int sr = 0;sr < grid.length;++sr){
            for(int sc = 0;sc < grid[0].length;++sc){
                if(grid[sr][sc] == '1'){
                    ++sum;       //遇到岛屿,sum+1
                    //遍历整个岛屿
                    DFS(grid,sr,sc);
                }
            }
        }
        return sum;
    }
}

提交结果:

微信图片_20221030151913.png

题目三、509. 斐波那契数


原题链接:509. 斐波那契数


题目描述:


斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1

开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

/

示例 1:

输入:n = 2

输出:1

解释:F(2) = F(1) + F(0) = 1 + 0 = 1

/

示例 2:

输入:n = 3

输出:2

解释:F(3) = F(2) + F(1) = 1 + 1 = 2

/

示例 3:

输入:n = 4

输出:3

解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

0 <= n <= 30


解题思路:

斐波拉契数,通过循环,返回当前元素的前两个数之和即可;


提交代码:

class Solution {
    public int fib(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        int before = 0;
        int after = 1;
        int curr = 0;
        for(int i = 1;i < n;++i){
            curr = before + after;
            before = after;
            after = curr;
        }
        return curr;
    }
}

提交结果:

微信图片_20221030151921.png


⚽求关注⚽ 作者🥇 .29. 🥇 的✔博客主页✔

⚽来刷题⚽ 记录每日LeetCode✔刷题专栏✔

您的点赞,收藏以及关注是对作者最大的鼓励喔 ~~


贵在坚持:

微信图片_20221029111446.jpg



目录
相关文章
|
6月前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
297 14
|
5月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
224 1
|
5月前
|
分布式计算 算法 Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本文讲解了两道经典的图论问题:**岛屿数量(LeetCode 200)** 和 **腐烂的橘子(LeetCode 994)**,分别通过 DFS/BFS 实现。在“岛屿数量”中,利用深度或广度优先搜索遍历二维网格,标记连通陆地并计数;“腐烂的橘子”则采用多源 BFS,模拟腐烂传播过程,计算最短时间。两者均需掌握访问标记技巧,是学习网格搜索算法的绝佳实践。
218 1
|
5月前
|
Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本篇博客详细解析了三道经典的动态规划问题:198. 打家劫舍(线性状态转移)、279. 完全平方数与322. 零钱兑换(完全背包问题)。通过 Go 语言实现,帮助读者掌握动态规划的核心思想及其实战技巧。从状态定义到转移方程,逐步剖析每道题的解法,并总结其异同点,助力解决更复杂的 DP 问题。适合初学者深入理解动态规划的应用场景和优化方法。
163 0
|
5月前
|
算法 Go 索引
【LeetCode 热题100】回溯:括号生成 & 组合总和(力扣22 / 39 )(Go语言版)
本文深入解析了LeetCode上的两道经典回溯算法题:**22. 括号生成**与**39. 组合总和**。括号生成通过维护左右括号数量,确保路径合法并构造有效组合;组合总和则允许元素重复选择,利用剪枝优化搜索空间以找到所有满足目标和的组合。两者均需明确路径、选择列表及结束条件,同时合理运用剪枝策略提升效率。文章附有Go语言实现代码,助你掌握回溯算法的核心思想。
197 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
241 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
164 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
350 2
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
245 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
324 1