leetcode 解题报告(43-50)

43. Multiply Strings

题目描述: 做乘法,只不过把数字用字符串表示,结果也返回字符串。

解题思路: 简单呗,用数组,一位一位得乘,模拟列竖式计算,特别注意的就是进位,还有就是题目给的数字长度是110位以内,注意 结果 应该是220位以内的,刚开始没注意到就总是越界。

AC代码:

// c++
class Solution {
public:
    string multiply(string num1, string num2) {
        int res[250]={0}; // 结果数组
        int length = 125,tmp; 
        for(int t = 0 ; t < num2.size(); t++)
        {
            for (int i = 0 ; i < num1.size() ; i ++)
                {
                    tmp = ((num1[num1.size()-1-i]-'0')) * ((num2[num2.size()-1-t]-'0')%10) + c[2*length-i-1-t]; // 一位一位计算 
                    if ( tmp < 10 ) 
                        res[2*length-i-1-t] = tmp ;
                    else // 处理进位
                    {
                        res[2*length-i-1-t] = tmp % 10 ;
                        res[2*length-i-2-t] += tmp / 10 ;
                    }
                }
        }
        string ans = "";
        int i = -1; // 数组转化成字符串
        while(i < 2*length-1 && c[++i] == 0);
        while(i < 2*length) ans += '0'+c[i++];
        return ans;
    }
};
# python 不得不说python就是好用
class Solution(object):
    def multiply(self, num1, num2):
        return str(int(num1)*int(num2))

46. Permutations

题目描述: 给一个无重复元素的数组,返回这个数组元素全排列的所有组合

解题思路: 利用递归的分治思想,假设有n个元素,如果可以把n-1个元素的全排列找出来,那么只需要在这些情况下再分别加上这n个元素做为开头或结尾就行了。另外c++还有一个库函数可以实现。

AC代码:

// c++
class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector <vector<int>> res;
        sort(nums.begin(), nums.end()); // 先排序找到第一个组合
        do{
            res.push_back(nums); // 记录结果
        }while(next_permutation(nums.begin(), nums.end())); // 直接调用库函数 找下一个组合
        return res;
    }
};
# python
class Solution(object):
    def permuteUnique(self, nums):
        if len(nums) <= 1: # 递归出口
            return [nums]
        res = []
        for i in nums:
            new = [x for x in nums]
            new.remove(i) # 复制一遍数组并且移除 i 剩下n-1项
            for j in self.permuteUnique(new): # 递归求n-1项的全排列
                res.append(j+[i]) # 记录答案
        return res

47. Permutations II

题目描述: 给一个有重复元素的数组,返回这个数组元素全排列的所有组合。

解题思路: 和上一题是一样的,只不过多了一个条件,那么在代码中多加一个限制条件也就行了。由于有重复元素,每个相同元素只要有一次出现在开头就行了,不然就会重复计算,于是就利用set集合不重复性就ok了。c++的库函数也可以处理这种情况,和上题一样的代码就过了。

AC代码:

# python
class Solution(object):
    def permuteUnique(self, nums):
        if len(nums) <= 1:
            return [nums]
        res = []
        for i in set(nums): # 把nums改成set(nums)
            new = [x for x in nums]
            new.remove(i)
            for j in self.permuteUnique(new):
                res.append(j+[i])
        return res

48. Rotate Image

题目描述: 给一个矩阵,按顺时针旋转90度,原地修改矩阵。

解题思路: 题目比较简单,计算好坐标就行了,不知道为什么要强调原地修改,如果不复制一遍的话,没办法修改啊。于是就先复制,然后又去覆盖一遍。

AC代码:

# python
class Solution(object):
    def rotate(self, matrix):
        new = [[y for y in x] for x in matrix]
        n = len(matrix)
        for i in range(n):
            for j in range(n):
                matrix[j][n-1-i] = new[i][j]
        return matrix

49. Group Anagrams

题目描述: 给一堆字符串归类,元素全部相同的归为一类。

解题思路: 题干简洁明了,但是给用什么方式给字符串归类成了问题,我想到的是给每个字符串排序,这样比较就绝对正确了,但是时间开销比较大,最后是险过了,有种蒙对的感觉。

Example:

Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

AC代码:

# python
class Solution(object):
    def groupAnagrams(self, strs):
        res = []
        pool = []
        for i in strs:
            new = sorted(i)
            if new in pool:
                res[pool.index(new)].append(i)
            else:
                res.append([i])
                pool.append(new)
        return res

50. Pow(x, n)

题目描述: 见名知意

解题思路: medium难度的,库函数一条代码搞定,不用库函数的话,得用快速幂不然得超时。

AC代码:

# python
class Solution(object):
    def myPow(self, x, n):
        return pow(x,n)
// c++
class Solution {
public:
    double myPow(double x, int n) {
        double ans = 1,tmp = x;
        if (x == 1.0 || n == 0) return 1.0; // 特殊情况节约时间
        
        long m = n; 
        if(m < 0)  m = -m; // 负数要注意,记录一下
        while(m)
        {
            if(m & 1)  ans = ans * tmp;
            m >>= 1;
            tmp = (tmp * tmp);
        }
        if (n < 0)
            ans = 1/ans;
        return ans;
    }
};

No. xx

题目描述: 模板

解题思路: 模板

AC代码:

###

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值