【剑指offer】10~11.斐波那契数列(C# 实现)

文章目录

  • 前言
  • 关于编译环境
  • 10- I. 斐波那契数列
  • 10- II. 青蛙跳台阶问题
  • 11. 旋转数组的最小数字
  • 结语

前言

🍀 大家好,我是哈桑。这是自己的 C# 做题记录,方便自己学习的同时分享出来。


关于编译环境

注意,笔者使用的编译环境是 .NET 7 和 C# 11。

10- I. 斐波那契数列

题目描述:

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例:

输入:n = 2
输出:1

代码实现:

public class Solution {
    public int Fib(int n) {
        double MOD = Math.Pow(10,9) + 7 ;
        
        if(n < 2)
        {
            return n;
        }

        double p = 0, q = 0, r =1;
        for(int i = 2; i < n+1;i++)
        {
            p = q;
            q = r; 
            r = (p + q) % MOD;  
        }

        return (int)r;
    }
}

运行结果:
在这里插入图片描述

思路讲解:

  • 根据斐波那契数列数列的逻辑,而第一二项分别为0和1,从第三项开始的值为前两项的和。可以使用循环和条件判断语句翻译这些逻辑
  • 创建 double 变量 p,q,r 分别表示数列的前三项。通过循环不断将变量 p、q 和 r 向前推进一位,直到走到 n 的位置
  • 循环结束将变量 r 强制转换为 int 类型返回即可

代码实现2:

public class Solution {
    public int Fib(int n) {
        int[] f = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 134903163, 836311896, 971215059, 807526948, 778742000, 586268941, 365010934, 951279875, 316290802, 267570670, 583861472, 851432142, 435293607, 286725742, 722019349, 8745084, 730764433, 739509517, 470273943, 209783453, 680057396, 889840849, 569898238, 459739080, 29637311, 489376391, 519013702, 8390086, 527403788, 535793874, 63197655, 598991529, 662189184, 261180706, 923369890, 184550589, 107920472, 292471061, 400391533, 692862594, 93254120, 786116714, 879370834, 665487541, 544858368, 210345902, 755204270, 965550172, 720754435, 686304600, 407059028, 93363621, 500422649, 593786270, 94208912, 687995182 };
        return f[n];
    }
}

运行结果2:
在这里插入图片描述

思路讲解:

  • 直接将所有结果按顺序存放在数组 f 中,根据索引值 n 返回数组中的元素即可
  • 虽然思路很简单,但也是一种解决方法

10- II. 青蛙跳台阶问题

题目描述:

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例:

输入:n = 2
输出:2

代码实现:

public class Solution {
    public int NumWays(int n) {
        int a = 1, b = 1, sum; 

        for(int i = 0; i < n; i++)
        {
            sum = (a + b) % 1000000007;
            a = b;
            b = sum;
        }
        return a; 
    }
}

运行结果:
在这里插入图片描述

思路讲解:

  • 像这类求解有多少种可能性的题目一般都有规律可循,也就是函数 f(n) 和 f(n - 1)…f(1) 之间是有联系的
  • 通过观察可以发现,青蛙跳台阶问题符合 f(n) = f(n - 1) + f(n -2) 的规律,接下里把这种规律翻译成代码即可
  • 思路和前面的斐波那契数列题目相差无几,这里不再赘述

11. 旋转数组的最小数字

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在重复元素值的数组 numbers,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。

示例:

输入:numbers = [3,4,5,1,2]
输出:1

代码实现:

public class Solution {
    public int MinArray(int[] numbers) {
        Array.Sort(numbers);    

        return numbers[0];
    }
}

运行结果:
在这里插入图片描述

思路讲解:

  • 首先题目明确要求返回数组中的最小元素,抛开是不是旋转数组不管,我们可以直接对数组进行升序排序,然后直接返回数组的第一个元素即可
  • 使用 Array.Sort 方法排序,返回 numbers[0] 元素

代码实现2:

public class Solution {
    public int MinArray(int[] numbers) {
        int low = 0;
        int high = numbers.Length - 1;

        while(low < high)
        {
            int pivot = low + (high - low) / 2;
            if (numbers[pivot] < numbers[high])
            {
                high = pivot;
            }else if (numbers[pivot] > numbers[high])
            {
                low = pivot + 1;
            }else
            {
                high--; 
            }
        }
        return numbers[low];
    }
}

运行结果2:
在这里插入图片描述

思路讲解: (使用二分查找,点击了解更多。)

  • 生成 low 和 high 整数变量分别表示 0 和 数组长度减一,使用循环语句进行判断
  • 第一种情况 numbers[pivot]<numbers[high] 时,说明 numbers[pivot] 是最小值右侧的元素,因此我们可以忽略二分查找区间的右半部分
  • 第二种情况是 numbers[pivot]>numbers[high],说明 numbers[pivot] 是最小值左侧的元素,因此我们可以忽略二分查找区间的左半部分
  • 第三种情况是 numbers[pivot]==numbers[high],由于有重复元素的存在,所以我们需要继续判断
  • 当整个循环结束时,我们就得到了最小值的索引位置了

结语

🌻 以上就是本次的做题记录啦,希望大家看完有所收获。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1500.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java学习星球,Java学习路线

目录一、Java学习路线二、学习计划三、为何会有Java学习星球&#xff1f;四、加入星球后&#xff0c;你可以得到什么&#xff1f;五、如何加入Java学习星球&#xff1f;六、打卡挑战大家好&#xff0c;我是哪吒&#xff0c;一个靠着热情攀登至C站巅峰的中年男子&#xff0c;CSD…

全网最火爆,Python接口自动化测试-接口数据 RSA 加密和签名实现(超详细)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在工作中&#xff0…

算法基础---数学知识

文章目录 质数 试除法判定质数试除法分解质因数朴素筛法求质数埃氏筛法求质数线性筛法求质数约数 试除法求所有约数试除法求所有约数之和约数个数和约数之和欧几里得算法一、质数 1.试除法判定质数--O(sqrt(N)) 原理&#xff1a;把从[2,n-1]中的每一个自然数作为除数来除n&a…

基于 Apache Flink 的实时计算数据流业务引擎在京东零售的实践和落地

摘要&#xff1a;本文整理自京东零售-技术研发与数据中心张颖&闫莉刚在 ApacheCon Asia 2022 的分享。内容主要包括五个方面&#xff1a; 京东零售实时计算的现状实时计算框架场景优化&#xff1a;TopN场景优化&#xff1a;动线分析场景优化&#xff1a;FLINK 一站式机器学…

【Linux】写一个基础的bash

头文件#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/wait.h> #include<sys/stat.h> #include<string.h> #include<pwd.h> #include<dirent.h>分割输入的命令串字符串或参数内容为空则退出strtok( ,…

【MySQL】数据类型

目录 一、数据类型分类 二、数值类型 bit&#xff1a; tinyint&#xff1a; ​编辑 smallint&#xff1a; memdiumint&#xff1a; int&#xff1a; bigint&#xff1a; float&#xff1a; ​编辑 decimal&#xff1a; 三、文本类型 char&#xff1a; 字符的概念&a…

出入了解——Vue.js

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

技术掉:PDF显示,使用pdf.js

PDF 显示 场景&#xff1a; 其实直接显示 pdf 可以用 iframe 标签&#xff0c;但产品觉得浏览器自带的 pdf 预览太丑了&#xff0c;而且无法去除那些操作栏。 解决方案&#xff1a;使用 pdf.js 进行显示 第一步&#xff1a;引入 pdf.js 去官网下载稳定版的 pdf.js 文件 然后…

ElasticSearch-第二天

目录 文档批量操作 批量获取文档数据 批量操作文档数据 DSL语言高级查询 DSL概述 无查询条件 叶子条件查询 模糊匹配 match的复杂用法 精确匹配 组合条件查询(多条件查询) 连接查询(多文档合并查询) 查询DSL和过滤DSL 区别 query DSL filter DSL Query方式查…

使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

兄弟们天天看基础看腻了吧 今天来分享一下如何使用Python突破某网游游戏JS加密限制&#xff0c;进行逆向解密&#xff0c;实现自动登录。 逆向目标 目标&#xff1a;某 7 网游登录主页&#xff1a;aHR0cHM6Ly93d3cuMzcuY29tLw接口&#xff1a;aHR0cHM6Ly9teS4zNy5jb20vYXBpL…

Vue的命令式和声明式的概念

1.命令式框架(jQuery) 这里有个小例子&#xff1a; 1.获取id为app的div标签 2.设置他的文本内容是hello&#xff0c;world 3.为其绑定点击事件 4.当点击时候弹出提示ok 1.首先我们通过$来活动app的标签 $(#app)//获取id为app的标签 2.然后通过text来讲内容设置为hello&am…

Sentinel 授权规则规则持久化

本篇博客我们来学习授权规则&#xff0c;授权规则是对请求者的一种身份的判断。 1、授权规则 授权规则是对请求者的身份做一个判断。你有没有权限来访问我&#xff1f;那就有人可能会说这个功能&#xff0c;好像以前我们在学习微服务的时候讲过网关他不就是把门的吗&#xff1…

云上办公系统项目

云上办公系统项目1、云上办公系统1.1、介绍1.2、核心技术1.3、开发环境说明1.4、产品展示后台前台1.5、 个人总结2、后端环境搭建2.1、建库建表2.2、创建Maven项目pom文件guigu-oa-parentcommoncommon-utilservice-utilmodelservice-oa配置数据源、服务器端口号application.yml…

springboot车辆充电桩

sprinboot车辆充电桩演示录像2022开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;ecli…

文法和语言的基本知识

一、什么形式化的方法用一套带有严格规定的符号体系来描述问题的方法二、什么是非形式化的方法对程序设计语言的描述从语法、语义和语用三个方面因素来考虑所谓语法是对语言结构定义所谓语义是描述了语言的含义所谓语用则是从使用的角度去描述语言三、符号串字母表和符号串字母…

vue基于vant封装可精确到秒的时间选择器

前言 在移动开发中&#xff0c;时间选择的控件比比皆是&#xff0c;但却鲜有类似的组件可以精确到秒级别的&#xff0c;官方可能是考虑到小屏幕手机的显示问题&#xff0c;也可能是使用的场景寥寥无几&#xff0c;但是少不代表没有&#xff0c;所以最近花了点时间基于 vant 组件…

011+limou+C语言深入知识——(3)“字符串函数”和“字符分类函数”和“内存操作函数”以及“部分库函数的模拟实现”

一、字符串库函数 001、求字符串长度strlen size_t strlen ( const char * str );注意size_t是一个无符号类型&#xff0c;没有正负 #include <stdio.h> #include <string.h> int main() {char*str1 "abcdef";strcmpchar*str2 "bbb";if( …

《Roller: Fast and Efficient Tensor Compilation for Deep Learning》

《Roller: Fast and Efficient Tensor Compilation for Deep Learning》 用于深度学习 快速高效的张量编译器 作者 微软亚洲研究院以及多伦多大学等多所高校 摘要 当前编译为了产生高效的kernel时&#xff0c;搜索空间大&#xff0c;通常使用机器学习的方法 找到最优的方案…

【测试开发篇3】软件测试的常用概念

目录 一、软件测试的生命周期(5个步骤) ①需求分析(两个角度) 用户角度&#xff1a; 开发人员的角度&#xff1a; ②测试计划 ③测试设计、测试开发 ④执行测试 ⑤测试评估 二、软件测试贯穿项目的整个生命周期的体现 需求分析阶段 计划阶段 设计阶段 编码阶段 …

Keil5安装和使用小记

随着keil版本的更新&#xff0c;一些使用问题一随之产生。本文针对安装目前最新版本keil软件和使用问题做一些总结。 目录1 Keil5下载&安装1.1 官网下载链接1.2 软件安装1.2.1 安装说明1.2.2 关于 51 和 ARM 共存的问题1.3 软件破解2 pack包安装 & 破解2.1 下载2.2 安装…