牛客编程巅峰赛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;
    }
};
posted @ 2020-07-12 10:20  Hayasaka  阅读(54)  评论(0编辑  收藏  举报