【每日刷题】Day98

【每日刷题】Day98

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 大数加法_牛客题霸_牛客网 (nowcoder.com)

2. 大数乘法_牛客题霸_牛客网 (nowcoder.com)

3. 扑克牌顺子_牛客题霸_牛客网 (nowcoder.com)

1. 大数加法_牛客题霸_牛客网 (nowcoder.com)

//思路:模拟。模拟加法以及加法的进位。

class Solution {

public:

    string solve(string s, string t)

    {

        string ans;

        int i = s.size()-1;

        int j = t.size()-1;

        int flag = 0;

        while(i>=0||j>=0)

        {

//从字符串最后,也就是个位数开始获取

            int ret1 = i>=0?s[i]-'0':0;

            int ret2 = j>=0?t[j]-'0':0;

//相加,>=10需要进位,因此需要%10

            ans.insert(0,1,(ret1+ret2+flag)%10+'0');

//flag为进位标志

            if(ret1+ret2+flag>=10)

                flag = 1;

            else

                flag = 0;

            if(i>=0)

                i--;

            if(j>=0)

                j--;

        }

//如果出了循环flag还为1,则进位多出一位

        if(flag)

            ans.insert(0,1,'1');

        return ans;

    }

};

2. 大数乘法_牛客题霸_牛客网 (nowcoder.com)

//思路:模拟竖式乘法。

//看图理解,一看就会:

class Solution {

public:

    string solve(string s, string t)

    {

        if(s[0]=='0')

            return s;

        if(t[0]=='0')

            return t;

        string ans;

        int size = s.size()+t.size();

        int* arr = (int*)calloc(size,sizeof(int));

//这里空出数组0号位置,用于进到最高位

        int sub = size-1;

        for(int i = t.size()-1;i>=0;i--)

        {

            int tmp = sub;

//每一位相乘存入数组

            for(int j = s.size()-1;j>=0;j--)

            {

                arr[tmp--] += (s[j]-'0')*(t[i]-'0');

            }

            sub--;

        }

        int flag = 0;

        for(int i = size-1;i>=1;i--)

        {

//进位后的数字

            ans.insert(0,1,(arr[i]+flag)%10+'0');

//进位数

            flag = (arr[i]+flag)/10;

        }

        if(flag)

            ans.insert(0,1,flag+'0');

        return ans;

    }

};

3. 扑克牌顺子_牛客题霸_牛客网 (nowcoder.com)

//思路:遍历+哈希记数。

//我们对numbers中非0的数进行记数,如果有两个相同的数则不可能构成顺子

//记数的同时我们记录0的个数,使用zero变量接收。

//记录完后我们定位到除0外的最小值与最大值区间,从两边向区间中间遍历,记录区间内0的个数,使用flag变量接收。

//最后返回zero是否≥flag,如果zero≥flag,则该区间一定能构成顺子;反之,则一定不能。

class Solution {

public:

    bool IsContinuous(vector<int>& numbers)

    {

        int hash[14] = {0};

        int flag = 0;

        int zero = 0;

        int up = 0;

        int down = 13;

        for(int i = 0;i<numbers.size();i++)

        {

//计算非0值的个数

            if(numbers[i]!=0)

                hash[numbers[i]]+=1;

//计算0的个数

            else

                zero++;

//如果有两个相同的数则不可能构成顺子

            if(hash[numbers[i]]>1)

                return false;

        }

//定位到除0外的最大最小值区间

        while(!hash[up])

        {

            up++;

        }

        while(!hash[down])

        {

            down--;

        }

        while(up<=down)

        {

//计算0的个数

            if(!hash[up])

                flag++;

            if(!hash[down])

                flag++;

            if(up==down&&!hash[up])

                flag--;

            up++;

            down--;

        }

        return zero>=flag;

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值