Leetcode刷题记录 day1 编程入门题

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.丑数

丑数 就是只包含质因数 23 和 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)

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值