阿里面试算法习题集1

0,1,n-1,这n个数排成一个圆,从数字0开始,从这个圆里一次删除第m个数。找出这个圈里剩下的最后一个数字。

比如0,1,2,3,4这五个数字组成一个圆。如果每次从数字0开始删除第三个数字,那么删除的前四个数字依次是2、0、4和1,所以最后剩下的数字是3。

示例1:

输入:n = 5,m = 3。

输出:3

示例2:

输入:n = 10,m = 17。

输出:2

请实现一个函数,输入一个整数,输出二进制表示的数字1。比如把9表示成二进制是1001,两位是1。因此,如果输入9,函数输出2。

示例1:

输入:000000000000000000000000000001011。

输出:3

说明:在输入的二进制字符串00000000000000000000000000101中,* *有三个数字“1”。

数字被序列化为一个字符序列,格式为0123456789112131415…在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,依此类推。

请写一个函数,求任意第n位对应的数。

示例1:

输入:n = 3

输出:3

示例2:

输入:n = 11

输出:0

请注意,这必须是长类型。

输入一个非负整数数组,将数组中的所有数字拼接成一个数字,打印出所有可拼接数字中最小的一个。

示例1:

输入:

输出:“102”

示例2:

输入:

输出:“3033459”

老师想给孩子们分发糖果。有n个孩子站成一条直线,老师会根据他们的表现提前给他们打分。

你需要按照以下要求,帮助老师给这些孩子分发糖果:

每个孩子至少分配到1块糖。

在邻近的孩子中,得分高的孩子必须得到更多的糖果。

那么老师至少需要准备多少糖果呢?

示例1:

输入:

输出:5

说明:你可以分别给这三个孩子分发2,1和2个糖果。

示例2:

输入:

输出:4

说明:可以分别给这三个孩子分发1,2,1的糖果。

第三个孩子只拿到了1的糖果,已经满足了以上两个条件。

一条环路上有n个加油站,其中第I个加油站有汽油气。

成本=

输出:3

贪婪的想法是,只要和大于0,就可以绕过去。

起始位置的贪婪思想是,如果sum从开始就小于0,那么一定不是从上一个位置开始,而是从当前的下一个位置开始,sum = 0被清零。

给定一个非负整数数组,您最初位于数组的第一个位置。

数组中的每个元素代表在该位置可以跳转的最大长度。

您的目标是以最少的跳数到达数组的最后一个位置。

示例:

输入:

输出:2

说明:跳到最后一个位置的最小次数是2。

从下标0跳到下标1,跳到1,再跳3步到达数组的最后一个位置。

给定一个非负整数数组,您最初位于数组的第一个位置。

数组中的每个元素代表在该位置可以跳转的最大长度。

判断自己是否能到达最后的位置。

示例1:

输入:

输出:真

说明:我们可以先跳1,从位置0跳到位置1,再从位置1跳到最后一个位置3步。

包含字母A-Z的消息以下列方式编码:

一个'-& gt;1

b '-& gt;2

...

z '-& gt;26

给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例1:

输入:“12”

输出:2

说明:可以解码为“AB”(1 2)或“L”(12)。

这里一定要注意第一个数是0的情况。s.charAt(0) == '0 '。如果第一个数字是0,我们必须直接返回0。

给定一个数组,它的第I个元素是给定股票在第I天的价格。

如果最多只允许你完成一次交易(即买卖一只股票一次),设计一个算法,计算出你能获得的最大利润。

注意:买股票之前不能卖股票。

示例1:

输入:

输出:5

解释:第二天买入(股价= 1),第五天卖出(股价= 6)。最大利润= 6-1 = 5。

注意利润不能是7-1 = 6,因为卖价需要大于买价;同时,不能先卖股票再买。

给定三个字符串s1、s2、s3和s3,验证S3是否由s1和s2组成。

示例1:

输入:s1 = "aabcc ",S2 = "dbbca ",S3 = " aadbbcbcac "。

输出:真

给你一个字符串S和一个字符规则P,请实现一个支持'.'的正则表达式匹配和“*”。

。匹配任何单个字符。

* '匹配零个或多个前面的元素。

所谓匹配就是覆盖整个字符串s,而不是字符串的一部分。

描述:

s可以是空的,只包含从a到z的小写字母。

p可以是空的,只包含从A到Z的小写字母以及字符。和*。

示例1:

输入:

s = "aa "

p = "a "

输出:假

解释:“a”无法匹配“aa”的整个字符串。

给定一个整数矩阵,求最长增量路径的长度。

对于每个单元格,您可以上下左右移动。不能对角移动,也不能越界(也就是不允许绕回)。

示例1:

输入:nums =

,

,

输出:(当然正确)

给定一些标有宽度和高度的信封,宽度和高度显示为整数对(w,h)。当另一个信封的宽度和高度大于这个信封时,这个信封就可以放进另一个信封里,就像俄罗斯娃娃一样。

请计算一下可以组成一组“俄罗斯娃娃”的信封的最大数量(即一个信封可以放在另一个信封里)。

描述:

不允许旋转信封。

示例:

输入:信封=,,,]

输出:3

说明:信封的最大数量是3,组合是:= & gt= & gt。

标准动态编程

一只青蛙想要过河。假设将河流平均分成x个单元格,每个单元格中可能有也可能没有石头。青蛙可以在岩石上跳,但是它们不能跳进水里。

给定一个石头的位置列表(以单元格编号升序表示),请决定青蛙能否成功过河(即能否跳到最后一步的最后一块石头)。一开始青蛙已经默认站在第一块石头上,可以假设第一步只能跳一个单位(也就是只能从1号单元格跳到2号单元格)。

如果青蛙上一步跳了k个单位,那么它的下一跳距离只能选k-1,k或k+1个单位。还请注意,青蛙只能向前跳(向终点方向)。

请注意:

结石数≥ 2且< 1100;

每颗宝石的位置序号是一个非负整数,它的

第一块石头的位置总是0。

示例1:

输出:3

思路是忽略第一个得到一个结果,忽略最后一个得到一个结果,只要每次有一个结果。

//可以用rangeCopy在函数中求解。

给定一个三角形,求从上到下的最小路径和。每个步骤只能移动到下一行的相邻节点。

这里的相邻节点是指下标等于或等于上节点下标+1的两个节点。

例如,给定一个三角形:

,

,

]

从上到下的最小路径和为11(即2+3+5+1 = 11)。

给定一个包含非负整数的m×n网格,请找出一条从左上角到右下角的路径,使路径上的数字之和最小。

注意:一次只能向下或向右移动一步。

示例:

输入:

,

,

]

输出:2

一个机器人位于一个m x n网格的左上角(起点在下图中标记为“start”)。

机器人一次只能向下或向右移动一步。机器人试图到达网格的右下角(下图中标有“完成”)。

有多少种不同的路径?

假设你正在爬楼梯。要走n步才能到屋顶。

一次可以爬1或者2级台阶。你有多少种不同的方法可以爬到楼顶?

注意:给定的n是正整数。

示例1:

输入:2

输出:2