1.整数的各位之积与和的差
给你一个整数 n
,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。
示例 1:
输入:n = 234 输出:15 解释: 各位数之积 = 2 * 3 * 4 = 24 各位数之和 = 2 + 3 + 4 = 9 结果 = 24 - 9 = 15
解题思路
使用n%10获取整数的末位,使用n/10获取整数的末位
代码实现
刚开始想的暴力解法
class Solution:
def subtractProductAndSum(self, n: int) -> int:
num_list = []
sub = 1
_sum = 0
while n != 0:
ge = n % 10
num_list.append(ge)
n = int((n - ge) / 10)
for num in num_list:
sub *= num
_sum += num
return sub - _sum
后来意识到不需要用到数组,因此改为
class Solution:
def subtractProductAndSum(self, n: int) -> int:
sub = 1
_sum = 0
while n != 0:
ge = n % 10
n = int((n - ge) / 10)
sub *= ge
_sum += ge
return sub - _sum
复杂度分析
时间复杂度为O(log n),空间复杂度为O(1)
2.判断一个数是否为2的幂
给你一个整数 n
,请你判断该整数是否是 2 的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 n == 2x
,则认为 n
是 2 的幂次方。
示例 1:
输入:n = 1 输出:true 解释:20 = 1
解题思路
暴力解法,首先挑出两个特殊的值:0和1;接下来使用循环,条件中n%2==0用来判断n是奇数还是偶数,n!=1用来用来判断偶数是否除到了最后一位。
可以注意到2的幂使用二进制表示时的特点:只有一个1。因此,可以使用二进制相关运算进行判断。
有两种常见的与「二进制表示中最低位」相关的位运算技巧。
第一个技巧是
n & (n - 1)
其中 &表示按位与运算。该位运算技巧可以直接将 n二进制表示的最低位 1 移除,若结果为0,说明n是2的幂
第二个技巧是
n & (-n)
这个方法可以直接获取二进制n的最低位1,若结果与n相等,则说明n是2的幂
代码实现
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and (n & (n - 1)) == 0
或者
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and (n & -n) == n
复杂度分析
时间复杂度O(1),空间复杂度O(1)
3.丑数
丑数 就是只包含质因数 2
、3
和 5
的正整数。
给你一个整数 n
,请你判断 n
是否为 丑数 。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:n = 6 输出:true 解释:6 = 2 × 3
示例 2:
输入:n = 1 输出:true 解释:1 没有质因数,因此它的全部质因数是 {2, 3, 5} 的空集。习惯上将其视作第一个丑数。
解题思路
一个数n是丑数的前提,是能被2,3,5中的至少一个数整除,因此可以使用n%2,n%3,n%5作为判断条件,并分别返回n/2,n/3,n/5继续判断,直到返回的n除不尽或为1为止。
代码实现
class Solution:
def isUgly(self, n: int) -> bool:
if n <= 0:
return False
while n % 2 == 0:
n /= 2
while n % 3 == 0:
n /= 3
while n % 5 == 0:
n /= 5
if n == 1 :
return True
else:
return False
复杂度分析
时间复杂度O(log n),空间复杂度O(1)
重新排列数组
给你一个数组 nums
,数组中有 2n
个元素,按 [x1,x2,...,xn,y1,y2,...,yn]
的格式排列。
请你将数组按 [x1,y1,x2,y2,...,xn,yn]
格式重新排列,返回重排后的数组。
示例 1:
输入:nums = [2,5,1,3,4,7], n = 3 输出:[2,3,5,4,1,7] 解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]
解题思路
可以看到题目的输入相当于是直接给了数组的长度和中点的位置,那就很简单了,只需要使用数组的下标填入元素即可
代码实现
def shuffle(self, nums, n: int):
shuffle_list = [0] * (2*n)
for i in range(n):
shuffle_list[2*i] = nums[i]
shuffle_list[2*i+1] = nums[n+i]
return shuffle_list
复杂度分析
时间O(n),空间O(1)