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

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