牛客编程巅峰赛S1第2场 - 青铜&白银A - 牛牛扔牌(双指针)
链接:https://ac.nowcoder.com/acm/contest/6219/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
牛牛现在有n张扑克牌,每张扑克牌都有点数和花色两部分组成。点数为‘1’-‘9’的正整数,花色为’C’,‘D’,‘H’,‘S’'其中的一个,分别表示梅花、方块、红桃、黑桃。现在牛牛想按一定的顺序把这n张牌扔掉。扔牌顺序的规则如下1.:
1.如果现在还剩素数张牌,则将牌顶的牌扔掉
2.如果现在还剩非素数张牌,则将牌底的牌扔掉
牛牛想知道他的扔牌顺序是什么,请返回扔牌顺序的字符串
示例1
输入
“3C8D6H3D”
输出
“3D3C8D6H”
说明
开始n=4,为非素数,扔掉牌底的牌3D
n=3,为素数,扔掉牌顶的牌3C
n=2,为素数,扔掉牌顶的牌8D
n=1,为非素数,扔掉牌底的牌6H
示例2
输入
复制
“8S8S8S8S8S8S8S”
输出
复制
“8S8S8S8S8S8S8S”
说明
因为全是8S,所以扔牌顺序的每一张牌也都是8S
备注:
对于100%的数据,1≤n≤10
题目大意:
给出一个字符串表示有几张牌,每张牌由点数和花色组成,即两个字符为一张牌 比如样例1中:3C 8D 6H 3D一共4张牌,要出输出扔牌的顺序,剩下的牌数为素数时,则扔掉牌底的牌,反之扔掉牌顶的牌。
解题思路:
定义一个变量cnt表示剩余的牌,然后用双指针模拟扔牌即可。AC代码:
class Solution {
public:
bool isprime(int n)
{
if(n==1)
return false;
int s=floor(sqrt(n)+0.5);
for(int i=2;i<=s;i++)
if(n%i==0)
return false;
return true;
}
string Orderofpoker(string s) {
string ans="";
int p=0,q=s.length()-1;
int cnt=s.length()/2;
while(cnt)//双指针模拟一下
{
if(isprime(cnt))
{
ans=ans+s[p]+s[p+1];
p+=2;
}
else
{
ans=ans+s[q-1]+s[q];
q-=2;
}
cnt--;
}
return ans;
}
};