2020-06-01 LeetCode 1431 拥有最多糖果的孩子&& 43 字符串相乘 C++

题目:

​  给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。

​  对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目。

示例1

输入:candies = [2,3,5,1,3], extraCandies = 3
输出:[true,true,true,false,true] 
解释:
孩子 1 有 2 个糖果,如果他得到所有额外的糖果(3个),那么他总共有 5 个糖果,他将成为拥有最多糖果的孩子。
孩子 2 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
孩子 3 有 5 个糖果,他已经是拥有最多糖果的孩子。
孩子 4 有 1 个糖果,即使他得到所有额外的糖果,他也只有 4 个糖果,无法成为拥有糖果最多的孩子。
孩子 5 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。

示例2:

输入:candies = [4,2,1,1,2], extraCandies = 1
输出:[true,false,false,false,false] 
解释:只有 1 个额外糖果,所以不管额外糖果给谁,只有孩子 1 可以成为拥有糖果最多的孩子。

 六一彩蛋啊,思路假设把全部糖果都给一个孩子,只要该孩子持有糖果数+额外糖果数>=持有最多糖果的孩子的糖果数(分配前),则该孩子满足条件,代码如下

class Solution {
public:
    vector<bool> kidsWithCandies(vector<int>& candies, int extraCandies) {
        int maxN = *max_element(candies.begin(), candies.end());
        vector<bool> ans;
        for(int candie:candies){
            if(candie+extraCandies>=maxN)
                ans.push_back(true);
            else ans.push_back(false);
        }
        return ans;
    }   
};

运行结果:

2020-06-01_104314

 连着几天做的简单题,还是得稍微做点别的,所以另外把43. 字符串相乘做了

题目:

 给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

示例1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例2:

输入: num1 = "123", num2 = "456"
输出: "56088"

说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

 经典大数运算题,我的思路就是竖式运算,模仿手算的过程,先遍历计算,用长度n1+n2的数组来存储各自位上计算值,然后遍历得到的结果数组来处理进位,代码如下:

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")
            return "0";
        int n1=num1.size(),n2=num2.size();
        int tmp[n1+n2];
        memset(tmp,0,sizeof(tmp));	
        int flag=0;
        string ans="";
        for(int i=0;i<n1;i++){
            for(int j=0;j<n2;j++){
                tmp[j+i]=(num1[n1-1-i]-'0')*(num2[n2-1-j]-'0')+tmp[i+j];
            }
        }
        //处理进位
        for(int i=0;i<n1+n2  ;i++){
            tmp[i]=tmp[i]+flag;
            flag=tmp[i]/10;
            tmp[i]=tmp[i]%10;
            ans+=(tmp[i]+'0');
        }
        reverse(ans.begin(),ans.end());
        int i=0;
        //去除开头多余的0
        while(ans[i]=='0') i++;
        ans=ans.substr(i);  
        return ans;
        
    }
};

运行结果:

2020-06-01_104242

 另外还可以在处理的过程中做进位的处理以及专门处理大数运算的Karatsuba,参考如下,持续埋坑中

https://leetcode-cn.com/problems/multiply-strings/solution/you-hua-ban-shu-shi-da-bai-994-by-breezean/

https://blog.csdn.net/u010983881/article/details/77503519

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章