【每日刷题】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;
}
};