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代码:
###