169 小C的排列询问
问题描述
小C拿到了一个排列,她想知道在这个排列中,元素x和y是否是相邻的。排列是一个长度为n的数组,其中每个数字从1到n恰好出现一次。
你的任务是判断在给定的排列中,x和y是否是相邻的。
测试样例
样例1:
输入:
n = 4, a = [1, 4, 2, 3], x = 2, y = 4
输出:True
样例2:
输入:
n = 5, a = [3, 4, 5, 1, 2], x = 3, y = 2
输出:False
样例3:
输入:
n = 6, a = [6, 1, 5, 2, 4, 3], x = 5, y = 2
输出:True
问题分析
给定一个排列arr(长度为n),我们要判断两个数字x和y是否相邻。相邻意味着这两个数字在数组中的索引差为1,即它们的位置相差一个单位。
-
输入:
- 第一步输入一个整数n,表示排列的长度。
- 第二步输入一个长度为n 的数组,表示排列的顺序。
- 第三步输入两个整数x和y,表示需要判断的两个元素。
-
输出:
- 如果x和y相邻,输出 "True”
- 如果x和y不相邻,输出 "False”
解决思路
-
找到x和y的位置:
- 对于排列中的每个元素,我们可以通过遍历找到 xxx 和 yyy 在数组中的索引位置。假设 xxx 的索引是ix,y的索引是iy。
-
判断是否相邻:
- 如果∣ix−iy∣=1,则x和y是相邻的;否则,它们不是相邻的。
主要代码如下:
find_x = a.index(x)
find_y = a.index(y)
if find_x == find_y + 1 or find_x == find_y - 1:
return True
else:
return False
复杂度分析
-
时间复杂度:
- 查找x和y的索引分别需要遍历一次数组,时间复杂度是O(n),其中n是数组的长度。
- 因此,总时间复杂度是O(n)。
-
空间复杂度:
- 我们只使用了常量空间来存储一些变量,所以空间复杂度是O(1)。
103 完美整数
问题描述
一个整数如果由相同的数字构成,则称为完美整数。例如:
1、11、333是完美整数。12、19、101是不完美整数。
现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。
测试样例
样例1:
输入:
x = 1 ,y = 10
输出:9
样例2:
输入:
x = 2 ,y = 22
输出:10
问题分析
题目要求我们计算一个区间[x,y]中有多少个整数是完美整数。完美整数的定义是由相同的数字组成的整数,例如 1、11、333 等。换句话说,完美整数是由一个数字重复若干次构成的整数。
要解这个问题,我们可以依次检查区间 [x,y]中的每个数,判断它是否是完美整数。一个数是完美整数的判断标准是:该数的所有数字都相同。例如:
- 对于数字 333,判断它的每一位数字是否相同,如果是,则它是一个完美整数。
- 对于数字 101,数字不相同,因此它不是完美整数。
输入:给定区间
输出:完美整数数量
解决思路
- 遍历区间:我们需要遍历给定的区间[x,y]中的所有数字。
- 判断是否为完美整数:对于每个数字,将数字转换为字符串形式。 判断该字符串中的所有字符是否相同。可以通过比较字符串中的第一个字符与其他所有字符是否相同来实现。判断它是否是完美整数。
- 计数:统计满足条件的完美整数的数量。
主要代码如下:
for d in range(1, 10):
num = d
while num <= y:
if num >= x:
count += 1
num = num * 10 + d
return count
复杂度分析
-
时间复杂度:O(log(y)),其中y是区间的上界。
-
空间复杂度:O(1),只使用了常数级别的空间。