每日一题
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public String addStrings(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
int index1 = len1 - 1;
int index2 = len2 - 1;
int sum = 0;
int carry_bit = 0;
StringBuffer ans = new StringBuffer();
while (index1 >= 0 || index2 >= 0 || carry_bit > 0)
{
int add_integer1 = ((index1 >= 0) ? num1.charAt(index1) - '0' : 0);
int add_integer2 = ((index2 >= 0) ? num2.charAt(index2) - '0' : 0);
sum = add_integer1 + add_integer2 + carry_bit;
ans.append(sum % 10);
carry_bit = sum / 10;
index1--;
index2--;
}
return ans.reverse().toString();
}
}
自己写的有问题,看着官方解答,改着改着就和人家的一样了:cry
#第二题
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
示例 1:
输入:word1 = “horse”, word2 = “ros”
输出:3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)
示例 2:
输入:word1 = “intention”, word2 = “execution”
输出:5
解释:
intention -> inention (删除 ‘t’)
inention -> enention (将 ‘i’ 替换为 ‘e’)
enention -> exention (将 ‘n’ 替换为 ‘x’)
exention -> exection (将 ‘n’ 替换为 ‘c’)
exection -> execution (插入 ‘u’)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/edit-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
word1 = 'o' + word1;
word2 = 'o' + word2;
int[][] dp = new int[len1 + 1][len2 + 1];
for (int i = 0; i <= len1; i++)
for (int j = 0; j <= len2; j++)
dp[i][j] = 0;
for (int i = 1; i <= len1; i++)
dp[i][0] = i;
for (int j = 1; j <= len2; j++)
dp[0][j] = j;
for (int i = 1; i <= len1; i++)
for (int j = 1; j <= len2; j++)
{
char a = word1.charAt(i);
char b = word2.charAt(j);
if (a == b)
{
dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]);
}
else
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1;
}
return dp[len1][len2];
}
public int min(int a, int b, int c)
{
if (a <= b && a <= c)
return a;
else if (b <= c)
return b;
else
return c;
}
}
动态规划经典问题,主要是推导出状态转移方程。
问题三
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
你能想出一个仅使用常数空间的一趟扫描算法吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
到这里,想放弃leetcode,这提交函数的机制着实让人摸不着头脑
问题四
1389A - LCM Problem
#include <iostream>
using namespace std;
int main()
{
int count;
cin >> count;
while (count != 0)
{
long long a, b;
cin >> a >> b;
if (a * 2 <= b)
cout << a << " " << 2 * a << endl;
else
cout << -1 << " " << -1 << endl;
count--;
}
}
做这个题,数学知识太重要了!!!