算法每日一题——08.03

每日一题

给定两个字符串形式的非负整数 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--;
	}
}

做这个题,数学知识太重要了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值