题解 | #牛牛扔牌#

牛牛扔牌

http://www.nowcoder.com/practice/e2cb4ea9888040ebb24eeed547a8d63a

牛牛扔牌

描述

现在有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 

方法一

思路分析

本题的思路其实比较简单,循环遍历整个字符串(由于一张牌由两个字符构成,因此只需要遍历字符串长度的一半即可),然后判断当前长度是否为素数,如果是素数,那么将字符串开始位置的两个字符赋值给字符串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)$
全部评论

相关推荐

肖先生~:大一点得到公司面试更能学到点东西
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3209次浏览 43人参与
# HR最不可信的一句话是__ #
1021次浏览 32人参与
# 巨人网络春招 #
11484次浏览 224人参与
# 春招至今,你的战绩如何? #
14766次浏览 137人参与
# AI面会问哪些问题? #
893次浏览 22人参与
# 你的实习产出是真实的还是包装的? #
2722次浏览 52人参与
# 米连集团26产品管培生项目 #
7077次浏览 224人参与
# 沪漂/北漂你觉得哪个更苦? #
1235次浏览 38人参与
# 你做过最难的笔试是哪家公司 #
1131次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2684次浏览 49人参与
# XX请雇我工作 #
51147次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7966次浏览 43人参与
# 简历第一个项目做什么 #
32073次浏览 357人参与
# 简历中的项目经历要怎么写? #
310908次浏览 4257人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152832次浏览 889人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187556次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64539次浏览 864人参与
# 如果重来一次你还会读研吗 #
229974次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178254次浏览 891人参与
# 你怎么看待AI面试 #
180654次浏览 1296人参与
# 正在春招的你,也参与了去年秋招吗? #
364172次浏览 2641人参与
# 腾讯音乐求职进展汇总 #
160822次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务