爬楼梯算法
A. 爬楼梯约做多少功
这个...你体重多少?算你60kg吧...7楼..每层楼多高?...算他3米吧...(取10N/kg)那么算法如下
W=FS=Gh=60kg*10N/kg*(7-1)*3m
=600N*18m
=10800J
B. C语言 爬楼梯的问题
用递归解决比较方便:
#include<stdio.h>
int fibonacci (int n)
{
if (n > 2)
return fibonacci(n - 1) + fibonacci(n - 2);
else
return 1;
}
int main()
{
int data[20];
int t;
int i;
printf ("Please input T and the nums: \n");
scanf ("%d", &t);
for (i=0; i<t; i++)
{
scanf("%d", &data[i]);
}
printf("The output: \n");
for (i=0; i<t; i++)
{
printf("%d\n", fibonacci (data[i]+1));
}
return 0;
}
/* 这是斐波那契算法的一个应用,你可以搜索一下 */
C. 幼儿园爬楼梯算法什么意思
爸爸妈妈要注意观察,当宝宝练至身体微微出汗时就应该停止,以防止运动过度,让宝宝厌倦并以后讨厌走楼梯这个活动,同时也可以防止过度的训练影响宝宝身体骨骼的发育。
D. leetcode算法
*最近在做一些 leetcode 的算法题,我会将自己做过的算法题记录下来以供大家参考,如果查找不方便请看 油猴插件实现网站左侧目录生成。
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例:
解答:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例:
提示:
解答:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例:
说明:
解答:
给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
示例:
解答:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例:
解答:
给定两个数组,编写一个函数来计算它们的交集。
示例:
说明:
进阶:
解答:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例:
解答:
给定一个数组 nums ,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
说明:
给定一个整数数组 nums 和一个目标值 target ,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
解答:
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例:
说明:
解答:
给定一个 *n *× *n* 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。 请不要 使用另一个矩阵来旋转图像。
示例:
解答:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须 原地修改输入数组 、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例:
解答:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例:
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解答:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
解答:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
长度一样,包含的字母都一样,每个字符出现的频率也一样,只是顺序不同而已,这就属于异位词,
示例:
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解答:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明 :本题中,我们将空字符串定义为有效的回文串。
示例:
解答:
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
注意 :假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
提示 :
示例:
解答:
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始) 。如果不存在,则返回 -1 。
示例:
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符
解答:
“外观数列”是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1 被读作 "one 1" ("一个一") , 即 11 。
11 被读作 "two 1s" ("两个一") , 即 21 。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211 。
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意 :整数序列中的每一项将表示为一个字符串。
示例:
解答:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 "" 。
示例:
说明:
所有输入只包含小写字母 a-z 。
解答:
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- head = [4,5,1,9],它可以表示为:
示例:
说明:
解答:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
解答:
反转一个单链表。
示例:
解答:
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
解答:
请判断一个链表是否为回文链表。
示例:
解答:
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1 ,则在该链表中没有环。
示例:
解答:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明 : 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7] ,
返回它的最大深度 3 。
解答:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
示例:
解答:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
解答:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树: [3,9,20,null,null,15,7] ,
返回其层次遍历结果:
解答:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9] ,
一个可能的答案是: [0,-3,9,-10,null,5] ,它可以表示下面这个高度平衡二叉搜索树:
解答:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
示例:
解答:
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, ..., n] ,你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例:
解答:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意 :给定 n 是一个正整数。
示例:
解答:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意 :你不能在买入股票前卖出股票。
示例:
解答:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
解答:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例:
解答:
打乱一个没有重复元素的数组。
示例:
解答:
设计一个支持 push , pop , top 操作,并能在常数时间内检索到最小元素的栈。
示例:
解答:
写一个程序,输出从 1 到 n 数字的字符串表示。
示例:
解答:
统计所有小于非负整数 n 的质数的数量。
示例:
解答:
给定一个整数,写一个函数来判断它是否是 3 的幂次方。
示例:
解答:
罗马数字包含以下七种字符: I , V , X , L , C , D 和 M 。
例如,罗马数字 2 写做 II ,即为两个并列的 1 。 12 写做 XII ,即为 X + II 。 27 写做 XXVII , 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII ,而是 IV 。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX 。这个特殊的规则只适用于以下六种情况:
示例:
解答:
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量 )。
示例:
提示:
E. 20个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法 把详细的解答过程写出来
这个题最简单的做法就是分析法。共有10946种。
假设阶梯有N层,则按N=1,2,3,4……逐步分析,推出一般规律,即走法a(n)=a(n-2)+a(n-1)可以看出这是一个递推公式。同时也满足菲波拉契数列的情况所以20级阶梯的走法a(20)就为菲波拉契数列的第20项a(20)=fib(20)=10946。
另外一种就比较复杂,根据走2步的不同情况分析,最少一个2步都不走,最多为10个:
(1)一个2步都不走,为1种情况。
(2)走1个2步,总共步数为19,从19个中随便选1个为2步的 C(19,1)
(3)走2个2步,总共步数18,从18个中随便选2个为2步的。C(18,2)
依次类推为C(17,3);C(16,4);C(15,5)……C(10,10)
总走法=1+C(19,1)+C(18,2)+C(17,3)+……+C(10,10)
=1+19+153+ 680+1820+……+1=10946
(5)爬楼梯算法扩展阅读:
关于分析法:
1.从求解的问题出发,正确地选择出两个所需要的条件,依次推导,一直到问题得到解决的解题方法叫做分析法。
2.用分析法解题时如果解题所需要的两个条件,(或其中一个条件)是未知的时候,就要分别求解找出这两个(或一个)的条件,一直到问题都是已知的时候为止。
3.分析法指从要证的结论出发,逐步寻求使它成立的充分条件,直到归结为判定一个显然成立的条件(已知量、定义、公理、定理、性质、法则等)为止,从而证明论点的正确性、合理性的论证方法。也称为因果分析、逆推证法或执果索因法。
F. 一自然数的各位数字之和是1784.该自然数是什么
2021-06-18 修改回答
找到了高效率的算法,直接计算出符合条件的自然数至少有多少个。
采用爬楼梯算法。把问题转换一下,一次可以爬1到9个台阶,爬上1784级台阶,一共有多少种方案?
递归公式,第n级的方案数量是f(n),则:
f(n)=f(n-9)+n(n-8)+n(n-7)+n(n-6)+n(n-5)+n(n-4)+n(n-3)+n(n-2)+n(n-1)
类似的讨论很多,证明就不列出了。这是斐波那契数列的一个扩展形式。
计算结果,不包含零的话,可以找到 9.46639556*10^535 个这样的自然数。
如果包含零,那就有无穷多个。
附:计算结果和fortran代码,结果是一个536位的大整数
2021-06-16 的回答
如果这个自然数的数字中可以包含0,那么就有无穷多个解。
如果这个自然数的数字中不包含0,那么:
它最少也要199位,也就是198个9和1个2的情形;最多可以是1784位的大整数,也就是都是1的情形。
没有现成的算法可以求解符合条件的大正整数的个数。可以估算一下达到何种规模。
123456789,九个数字的和是45。1784/45=39余29。
因此,可以用1到9重复使用45次,剩下的29分拆为3个9,1个2。
这样是:42个9,40个2,其它数字都是39个,一共是42+40+39*7=355位。
这个组合的全排列数量是:
355!/(39!)^7/42!/40! =4.*10^329
方案的数量达到了 10的330次方。极其巨大!
这还只是其中的一个组合的全排列情形。可以肯定,这个问题的解远不止这个规模。
供参考。
G. 算法设计 爬楼梯类型,共n阶楼梯,一次最多爬m阶,用JAVA或者C或者C++
循环,,,,,好多循环,,,,哇,,,,实现了
#include<string.h>
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int n = 0, m = 0, sum = 0, cnt = 0;
cout << "输入阶梯数:" << endl;
cin >> n;
cout << "输入最多爬的阶梯数:" << endl;
cin >> m;
if (n <= 0)
{
cout << "就一种,上去了!" << endl;
}
if (m <= 0)
{
cout << "你想上是不可能的!" << endl;
}
int i;
stack<int> sk;
do
{
if (sum <= n)
{
++cnt;
while (sum <= n)
{
sk.push(1);
++sum;
}
}
if (!sk.empty())
{
sum -= sk.top();
sk.pop();
}
else
{
cout << cnt << endl;
return 0;
}
HHH:
if (!sk.empty())
{
i = sk.top();
}
else
{
cout << cnt << endl;
return 0;
}
if (i < m)
{
++i;
}
else
{
if (!sk.empty())
{
sum -= sk.top();
sk.pop();
goto HHH;
}
else
{
cout << cnt << endl;
return 0;
}
}
if (!sk.empty())
{
sum -= sk.top();
sk.pop();
}
else
{
cout << cnt << endl;
return 0;
}
sk.push(i);
sum += i;
} while (1);
return 0;
}
H. 猴子爬楼梯十个台阶不跳下可以爬一层,两层,三层有几种方法
相加组合等于10有下面14种基本可能
10个1,只有1种排列方式
5个2,只有1种排列方式
8个1,1个2,8个1排列,8个1之间7个位置,前后有2个位置,合计9个位置,9个位置选一个插入2,所以有9种排列方式
6个1,2个2,6个1之间和前后有7个位置。2个2如果是隔开的,7个位置选2个插入2,共有C(2,7)=21种可能;2个2如果在一起,则有7种可能,故共有21+7=28种排列方式
4个1,3个2,4个1之间和前后有5个位置,3个2如果是隔开的,4个位置选3个插入2,共有C(3,5)=10种可能;2个2在一起,另一个2单独,那么有A(2,5)=20种可能;3个2在一起,共有5种可能,故共有10+20+5=35种排列方式
2个1,4个2,4个2之间和前后有5个位置,2个1如果是隔开的,共有C(2,5)=10种可能;2个1在一起,那么有5种可能,故共有10+5=15种排列方式
7个1,1个3,7个1之间和前后有8个位置,1个3选一个,共有8种排列方式
4个1,2个3,4个1之间和前后有5个位置,2个3如果隔开的,共有C(2,5)=10种可能;2个3在一起,那么有5种可能,故共有10+5=15种排列方式
1个1,3个3,3个3之间和前后有4个位置,1个1选一个插入,共有4种排列方式
2个2,2个3,2个3之间和前后有3个位置,2个2如果隔开的,共有C(2,3)=3种可能,2个2如果在一起,那么有3种可能,故共有3+3=6种排列方式
1个1,3个2,1个3,3个2之间和前后有4个位置,1个1先放入,有4种可能,放入1后,3个2和1个1之间有5个位置,选一个放入3,有5种可能,故共有4X5=20种排列方式
3个1,2个2,1个3,3个1之间和前后有4个位置,2个2先放入,如果2个2在一起,有4种可能;2个2分开,有C(2,4)=6种可能。3个1和2个2之间有6个位置,选1个放入3,有6种可能,故共有(4+6)X6=60种排列方式
5个1,1个2,1个3,5个1之间和前后有6个位置,1个2先放入,有6种可能;5个1和1个2之间和前后共7个位置,选1个放入3,有7种可能,故共有6X7=42种排列方式
2个1,1个2,2个3,2个1之间和前后有3个位置,2个3放入,如果2个3分开,有C(2,3)=3种可能;如果2个3在一起,有3种可能;2个1和2个3之间,有5个位置,选1个放入2,有5种可能,故共有(3+3)X5=30种排列方式
综上所述:
猴子跳台阶共计14种基本组合
共计1+1+9+28+35+15+8+15+4+6+20+60+42+30=274种跳法排列
I. 爬楼梯问题--有n阶台阶,上楼可以一步上1阶,2阶,3阶,计算共有多少种不同的走法
简单的dp问题:
#include
int step[2048];
int* p = step;
void foo(int n)
{
if(n > 0) {
if(n > 1) {
*p++ = 2;
foo(n-2);
--p;
}
*p++ = 1;
foo(n-1);
--p;
} else {
for(int* k = step; k != p; ++k)
printf("%d ",*k);
putchar('\n');
}
}
int main()
{
foo(5);
}
J. 使用python算法如何解
解决方案
从一些测试案例开始总是好的做法。让我们从小的案例开始,看看能否找到某种规律。
.N=1,1种爬楼方式:[1]
.N=2,2种爬楼方式:[1,1],[2]
.N=3,3种爬楼方式:[1,2],[1,1,1],[2,1]
.N=4,5种爬楼方式:[1,1,2],[2,2],[1,2,1],[1,1,1,1],[2,1,1]
你有没有注意到什么?请看N=3时,爬完3阶楼梯的方法数量是3,基于N=1和N=2。存在什么关系?
爬完N=3的两种方法是首先达到N=1,然后再往上爬2步,或达到N=2再向上爬1步。所以f(3)=f(2)+f(1)。
这对N=4是否成立呢?是的,这也是成立的。因为我们只能在达到第三个台阶然后再爬一步,或者在到了第二个台阶之后再爬两步这两种方式爬完4个台阶。所以f(4)=f(3)+f(2)。
所以关系如下:f(n)=f(n–1)+f(n–2),且f(1)=1和f(2)=2。这就是斐波那契数列。
deffibonacci(n):
ifn<=1:
return1
returnfibonacci(n-1)+fibonacci(n-2)
当然,这很慢(O(2^N))——我们要做很多重复的计算!通过迭代计算,我们可以更快:
deffibonacci(n):
a,b=1,2
for_inrange(n-1):
a,b=b,a+b
returna
现在,让我们尝试概括我们学到的东西,看看是否可以应用到从集合X中取步数这个要求下的爬楼梯。类似的推理告诉我们,如果X={1,3,5},那么我们的算法应该是f(n)=f(n–1)+f(n–3)+f(n–5)。如果n<0,那么我们应该返回0,因为我们不能爬负数。
defstaircase(n,X):
ifn<0:
return0
elifn==0:
return1
elifninX:
return1+sum(staircase(n-x,X)forxinXifx<n)
else:
returnsum(staircase(n-x,X)forxinXifx<n)
这也很慢(O(|X|^N)),因为也重复计算了。我们可以使用动态编程来加快速度。
每次的输入cache[i]将包含我们可以用集合X到达台阶i的方法的数量。然后,我们将使用与之前相同的递归从零开始构建数组:
defstaircase(n,X):
cache=[0for_inrange(n+1)]
cache[0]=1
foriinrange(n+1):
cache[i]+=sum(cache[i-x]forxinXifi-x>0)
cache[i]+=1ifiinXelse0
returncache[-1]
现在时间复杂度为O(N*|X|),空间复杂度为O(N)。