牛牛扔牌
描述
现在有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
n=3,为素数,扔掉牌顶的牌3C
n=2,为素数,扔掉牌顶的牌8D
n=1,为非素数,扔掉牌底的牌6H
示例2
输入:"8S8S8S8S8S8S8S"
返回值:"8S8S8S8S8S8S8S"
说明:因为全是8S,所以扔牌顺序的每一张牌也都是8S
方法一
思路分析
本题的思路其实比较简单,循环遍历整个字符串(由于一张牌由两个字符构成,因此只需要遍历字符串长度的一半即可),然后判断当前长度是否为素数,如果是素数,那么将字符串开始位置的两个字符赋值给字符串temp,开始位置index向后增加两个位置;如果是非素数,那么将字符串末尾位置的两个字符赋值给字符串temp,末尾位置index向前增加两个位置;直到遍历完即可。
图解
核心代码
class Solution {
public:
/**
*
* @param x string字符串 字符串从前到后分别是从上到下排列的n张扑克牌
* @return string字符串
*/
string Orderofpoker(string x) {
// write code here
int length_x =x.length();
int current_len=length_x/2;
string temp="";
int left=0;
int right=length_x-1;
for(int i=0;i<length_x/2;i++)//循环次数减半
{
if(prime(current_len))
{
temp+=x[left];
temp+=x[left+1];
left+=2;//开始位置向后两个位置
}
else
{
temp+=x[right-1];
temp+=x[right];
right-=2;//末尾位置向前两个位置
}
current_len--;
}
return temp;
}
int prime(int n)//判断是否为素数
{
if (n==0||n==1)
{
return 0;
}
for(int i=2;i*i<=n;i++)//只需要判断到平方根n即可
{
if (n%i == 0)
{
return 0;
}
}
return 1;
}
}; 复杂度分析 - 时间复杂度:代码时间开销主要在遍历字符串,以及判断素数,设$n$表示字符串长度,循环遍历次数为$n/2$,需要对$n/2$个数判断是否为素数,时间复杂度为
,因此总的时间复杂度为
- 空间复杂度:额外的空间复杂度为$O(1)$
方法二
思路分析
本题中给出了n的取值范围,因此可以预先给出n之内的整数的素数判断,然后在进行判定时直接进行查询,可以降低时间复杂度。
核心代码
class Solution {
public:
/**
*
* @param x string字符串 字符串从前到后分别是从上到下排列的n张扑克牌
* @return string字符串
*/
string Orderofpoker(string x) {
// write code here
int length_x =x.length();
if(length_x<0||length_x%2!=0) return "";
int current_len=length_x/2;
string temp="";
int left=0;
int right=length_x-1;
int array[11]={0,0,1,1,0,1,0,1,0,0,0};
for(int i=0;i<length_x/2;i++)//循环次数减半
{
if(array[current_len])
{
temp+=x[left];
temp+=x[left+1];
left+=2;//开始位置向后两个位置
}
else
{
temp+=x[right-1];
temp+=x[right];
right-=2;//末尾位置向前两个位置
}
current_len--;
}
return temp;
}
}; 复杂度分析
- 时间复杂度:代码时间开销主要在遍历字符串,以及判断素数,而判断素数已经预先定义了,因此设$n$表示字符串长度,循环遍历次数为$n/2$,时间复杂度为$O(n)$
- 空间复杂度:定义了一个字符串长度与给定的字符串相等,定义一个数组存储$n$之内的整数是否为素数的判定情况,额外的内存空间为$O(n)$

京公网安备 11010502036488号