首页 > 试题广场 >

牛牛扔牌

[编程题]牛牛扔牌
  • 热度指数:1009 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现在有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 

备注:
public String Orderofpoker (String x) {
        // write code here
        String ss="";
        int n=x.length()/2;
        while(n>0){
            if(isPrime(n)){
                ss+=x.substring(0,2);
                x=x.substring(2);
            }else{
                ss+=x.substring(x.length()-2);
                x=x.substring(0,x.length()-2);
            }
            n--;
        }
        return ss;
    }
    public boolean isPrime(int n){
        if(n==1)
            return false;
        if(n==2)
            return true;
        for(int i=2;i<n;i++){
            if(n%i==0)
                return false;
        }
        return true;
    }

发表于 2021-08-24 11:21:46 回复(0)
import java.util.*;


public class Solution {
    public String Orderofpoker (String x) {
        ArrayList<Integer> table = new ArrayList<>();
        table.add(2);
        table.add(4);
        table.add(6);
        table.add(10);
        table.add(14);
        
        StringBuffer resultBuffer = new StringBuffer();
        
        while (x.length() != 0) {
            if (table.contains(x.length())) {
                resultBuffer.append(x.substring(0, 2));
                x = x.substring(2);
            } else {
                resultBuffer.append(x.substring(x.length() - 2));
                x = x.substring(0, x.length() - 2);
            }
        }
        
        String result = resultBuffer.toString();
        
        return result;
    }
}
import java.util.*;


public class Solution {
    public String Orderofpoker (String x) {
        
        StringBuffer resultBuffer = new StringBuffer();
        
        while (x.length() != 0) {
            if (isPrime(x.length() / 2)) {
                resultBuffer.append(x.substring(0, 2));
                x = x.substring(2);
            } else {
                resultBuffer.append(x.substring(x.length() - 2));
                x = x.substring(0, x.length() - 2);
            }
        }
        
        String result = resultBuffer.toString();
        
        return result;
    }
    
    private boolean isPrime(int value) {
        
        if (value == 1) {
            return false;
        }
        
        int sqrt = (int) Math.sqrt(value);
        
        for (int i = 2; i <= sqrt; i++) {
            if (value % i == 0) {
                return false;
            }
        }
        
        return true;
    }
}


编辑于 2021-05-19 00:36:01 回复(0)
class Solution {
public:
    /**
     * 
     * @param x string字符串 字符串从前到后分别是从上到下排列的n张扑克牌
     * @return string字符串
     */
    string Orderofpoker(string x) {
        string str = "";
        int len = x.length();
        int temp = len/2;
        int temp2 = temp;
        int begin = 0;
        int end = len-1;
        for(int i=0;i<temp2;i++)
        {
            if(judgeprime(temp))
            {
                str += x[begin];
                str += x[begin+1];
                begin+=2;
            }
            else
            {
                str += x[end-1];
                str += x[end];
                end-=2;
            }
            temp-=1;
        }
        return str;
        // write code here
    }
    bool judgeprime(int num)
    {
        if(num==0||num==1)
        {
            return false;
        }
        int sqr = (int)sqrt(1.0*num);
        for(int i=2;i<=sqr;i++)
        {
            if(num%i==0)
            {
                return false;
            }
        }
        return true;
        
    }
};
这里有几个要注意的点:
第一,判断素数的时候要降低时间复杂度,开根号可以优化到O(n)
第二,两个字符一张牌,总数肯定是偶数,每次要移动两次下标,即+=2
第三,注意循环次数是总字符串长度的一半
发表于 2020-07-21 00:39:01 回复(0)