欧美1区2区3区激情无套,两个女人互添下身视频在线观看,久久av无码精品人妻系列,久久精品噜噜噜成人,末发育娇小性色xxxx

首頁(yè) > 試題廣場(chǎng) >

撲克牌順子

[編程題]撲克牌順子
  • 熱度指數(shù):486304 時(shí)間限制:C/C++ 1秒,其他語(yǔ)言2秒 空間限制:C/C++ 256M,其他語(yǔ)言512M
  • 算法知識(shí)視頻講解
現(xiàn)在有2副撲克牌,從撲克牌中隨機(jī)五張撲克牌,我們需要來判斷一下是不是順子。
有如下規(guī)則:
1. A為1,J為11,Q為12,K為13,A不能視為14
2. 大、小王為 0,0可以看作任意牌
3. 如果給出的五張牌能組成順子(即這五張牌是連續(xù)的)就輸出true,否則就輸出false。
4.數(shù)據(jù)保證每組5個(gè)數(shù)字,每組最多含有4個(gè)零,數(shù)組的數(shù)取值為 [0, 13]

要求:空間復(fù)雜度 ,時(shí)間復(fù)雜度 ,本題也有時(shí)間復(fù)雜度 的解法

輸入描述:
輸入五張撲克牌的值


輸出描述:
五張撲克牌能否組成順子。
示例1

輸入

[6,0,2,0,4]

輸出

true

說明

中間的兩個(gè)0一個(gè)看作3,一個(gè)看作5 。即:[6,3,2,5,4]
這樣這五張牌在[2,6]區(qū)間連續(xù),輸出true 
示例2

輸入

[0,3,2,6,4]

輸出

true
示例3

輸入

[1,0,0,1,0]

輸出

false
示例4

輸入

[13,12,11,0,1]

輸出

false
算法知識(shí)視頻講解
import java.util.HashSet;
import java.util.Set;

public class Solution {
    public boolean IsContinuous(int [] numbers) {
        if(numbers.length == 0) return false;
    	Set<Integer> set = new HashSet<>();
    	int maxn = -1, minn = 14;
    	for(int a: numbers)
    	{
    		if(!set.add(a) && a!=0) return false;
    		if(a!=0) {
    			maxn = Math.max(maxn, a);
    			minn = Math.min(minn, a);
    		}
    	}
    	if(maxn - minn <=4) return true;
    	return false;
    	
    }
}

發(fā)表于 2016-08-04 15:56:01 回復(fù)(3)
思路:
1)沒有大小王的時(shí)候即判斷數(shù)是否連續(xù);
2)有大小王的時(shí)候,判斷數(shù)的間隔是否小于王的數(shù)量。小于返回true,大于返回false;
3)有相等的牌則直接返回false。
解法一;
import java.util.*;
public class Solution {
    public boolean IsContinuous(int [] numbers) {
		if(numbers == null || numbers.length <= 4)
            return false;
        
        //先排序,否則計(jì)算間隔的時(shí)候可能會(huì)出現(xiàn)負(fù)值,比較麻煩
        Arrays.sort(numbers);
        int totalGap = 0;
        //計(jì)算大小王的數(shù)量
        int countZero = 0;
        for(int i = 0; i < numbers.length; i++){
            if(numbers[i] == 0){
                countZero++;
                continue;
            }
            //計(jì)算兩數(shù)之間的間隔
            if(i < numbers.length - 1){
                int gap = numbers[i + 1] - numbers[i] - 1;
                //如果出現(xiàn)對(duì)子,如2 2,則gap為-1,直接返回false
                if(gap < 0)
                    return false;
                totalGap += gap;
            }
        }
        //所有數(shù)間隔大于王數(shù)量,就返回false
        if(totalGap > countZero){
            return false;
        }
        return true;
    }
}
解法二:
import java.util.*;
public class Solution {
   public static boolean IsContinuous(int [] numbers) {
       		if(numbers == null || numbers.length <= 4)
                return false;
	        Arrays.sort(numbers);
			int count = 0;
	        for(int i : numbers){
	            if(i == 0)
	                count++;
	        }
	        //不含0,即不包含大小王
	        if(count == 0){
	            if(isSequence(numbers)){
	                return true;
	            }else{
	                return false;
	            }
	        }
	        //包含大小王
	        else{
	            if(count == 4)
	                return true;
	            int sum = 0;
	            //計(jì)算間隔數(shù)
	            for(int i = count + 1; i < numbers.length; i++){
	            	int gap = numbers[i] - numbers[i - 1] - 1;
	                if(gap < 0)
	                    return false;
	                sum += gap;
	            }
	            if(sum > count){
	                return false;
	            }
	            return true;
	        }
	    }
	    
	    private static boolean isSequence(int[] numbers){
	        
	        for(int i = 1 ; i < numbers.length; i++){
	            if(numbers[i] - numbers[i-1] != 1){
	                return false;
	            }
	        }
	        return true;
	    }
}

發(fā)表于 2017-07-22 10:16:22 回復(fù)(4)
Python

class Solution:
??? def IsContinuous(self, numbers):
??????? # write code here
??????? if len(numbers) < 5:
??????????? return False
??????? #計(jì)算0的個(gè)數(shù)
??????? nOfZero = numbers.count(0)
??????? #排序
??????? numbers.sort()
??????? #序列中間隔的值初始化為0
??????? sumOfGap=0
??????? #遍歷非0部分的遞增序列
??????? for i in range(nOfZero, len(numbers) - 1):
??????????? small = numbers[i]
??????????? big = numbers[i + 1]
??????????? #當(dāng)前與下一個(gè)值的比較,若相等則說明存在對(duì)子
??????????? if small == big:
??????????????? return False
??????????? else:
??????????????? #若不同,則得到二者的差再減1,若為0則說明連續(xù),否則二者之間存在空缺
??????????????? sumOfGap+= (big-small - 1)
??????????????? #判斷0的個(gè)數(shù)及序列中非0部分間隔值,若0不小于間隔值,則說明滿足連續(xù)條件
??????? if nOfZero >= sumOfGap:
??????????? return True
??????? else:
??????????? return False

發(fā)表于 2017-10-17 18:01:54 回復(fù)(3)
class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.size()!=5) return false;
        sort(numbers.begin(),numbers.end());
        int i=0;
        while(numbers[i]==0) i++;
        if(numbers[4]-numbers[i]>4) return false;
        for(int j=i;j<4;j++){
            if(numbers[j]==numbers[j+1]) return false;
        }
        return true;
    }
};

發(fā)表于 2017-03-15 14:01:04 回復(fù)(9)
/*
	 * 思路:大小王看為0;則牌范圍為0~13;
	 * a[0]存放大小王數(shù)目; a[i] (1~13)不為0表示牌被抽到;
	 * a[i]~a[i+4] (a[i]為第一個(gè)不為0即抽到的牌);
	 * 統(tǒng)計(jì)滿足連續(xù)其中缺少的牌 即a[i]==0的個(gè)數(shù);
	 * 與大小王個(gè)數(shù)比較即可
	 */
public class Solution {
    public boolean IsContinuous(int [] numbers) {
    	int[] a=new int[14];
    	for(int i=0;i<numbers.length;i++){
    		a[ numbers[i] ]++;
    	}
    	
    	for(int i=1;i<a.length-6;i++){
    		if(a[i]!=0){
    			int count=0;
    			for(int j=i;j<i+5;j++){
    				if(a[j]==0){
    					count++;
    				}
    			}
    			if(count==a[0]){
    				return true;
    			}
    			break;
    		}
    	}
    	return false;   	
    }
}
編輯于 2017-02-22 19:53:47 回復(fù)(5)
import java.util.Arrays;
 public class Solution {
     public boolean IsContinuous(int [] numbers) {
         if(numbers.length != 5)    //不夠5張的時(shí)候返回false;
             return false;
         Arrays.sort(numbers);    //排序,方便統(tǒng)計(jì)王(0)的數(shù)量以及比較是否存在相等的牌(前后比較即可)
         int res = 0;    //統(tǒng)計(jì)王(0)的數(shù)量
         for(int i=0;i<numbers.length;i++){
             if(numbers[i] == 0){
                 res++;
                 continue;
             }
             //王的數(shù)量小于等于3張時(shí)才需要做判斷
             //判斷第一張非0的牌與最后一張的差,超過4,則不可能是順子
             //判斷前后張牌是否相等,相等則不可能是順子
             if(res !=4 && (numbers[numbers.length-1]-numbers[i]>4 ||numbers[i] == numbers[i+1]))
                 return false;
             else 
                 return true;
         }
         return true;
     }
 }
發(fā)表于 2017-10-04 16:01:42 回復(fù)(1)
sort一下,
0 的個(gè)數(shù)<5 && 正數(shù)互不相同 && 正數(shù)最大最小值相差 < 5

class Solution {
public:
? ? bool IsContinuous( vector<int>& a ) {
? ? ? ? if(a.size() != 5) return false;
? ? ? ? sort(a.begin(), a.end());
? ? ? ? int c = 0;
? ? ? ? while(c < 5 && a[c] == 0) ++c;
? ? ? ? for(int i = c; i < 5; ++i) if(i && a[i] == a[i - 1]) return false;
? ? ? ? return c < 5 && (a[4] - a[c]) < 5;
? ? }
};

發(fā)表于 2015-09-09 11:52:39 回復(fù)(0)
先排個(gè)序
遍歷一遍 ,記錄0的次數(shù),后面兩個(gè)數(shù)的差要是大于1就用0的個(gè)數(shù)(王的個(gè)數(shù))替代大于1的差,不夠用就false;
然后兩數(shù)也不能相等
import?java.util.*;
public?class?Solution?{
????public?boolean?IsContinuous(int?[]?numbers)?{
????????int?cnt=0;
????????Arrays.sort(numbers);
????????for(int?i=0;i<numbers.length-1;i++){
????????????if(numbers[i]==0)?cnt++;
????????????else?if(numbers[i+1]-numbers[i]-1>cnt||numbers[i+1]==numbers[i])?
????????????????return?false;
????????????else?cnt=cnt-(numbers[i+1]-numbers[i]-1);
????????}
???????????return?true;
????}
}



發(fā)表于 2021-09-29 17:36:31 回復(fù)(0)
function?IsContinuous(numbers)
{
????//?write?code?here
????var?joker?=?0;
????var?n?=?numbers.sort();
????for(let?i=0;i<4;i++){
????????if(n[i]==0)?joker++;
????????else?if(n[i]==n[i+1])?return?false;
????}
????return?n[4]-n[joker]<5;
}

發(fā)表于 2021-08-30 21:23:41 回復(fù)(0)
class?Solution:
????def?IsContinuous(self,?numbers):
????????#?write?code?here
????????if?not?numbers:
????????????return?False
????????ns?=?[n?for?n?in?numbers?if?n?!=?0]
????????return?(max(ns)?-?min(ns)?<=?4)?and?(len(ns)?==?len(set(ns)))
想法很簡(jiǎn)單:先把0拿掉,剩下的3個(gè)或4個(gè)或5個(gè)數(shù)字只要 1)不重復(fù);2)最大最小差不超過4即可。不用關(guān)心具體有幾個(gè)王。
發(fā)表于 2020-02-05 12:55:07 回復(fù)(0)
/**
@author zhengyanan
@date 2017/3/1 @time 10:54
version_2:
核心思路:
1.在verison_1的思路上進(jìn)一步優(yōu)化:
當(dāng)從counts[i]訪問到counts[i+5]時(shí),對(duì)于訪問數(shù)組邊界而提前退出訪問的情況,我們考慮將counts 的長(zhǎng)度+4,,從而將這種特殊情況統(tǒng)一到常規(guī)情況中,從而簡(jiǎn)化處理邏輯,精簡(jiǎn)代碼。

運(yùn)行時(shí)間:36ms
占用內(nèi)存:528k
*/
? ? public boolean IsContinuous(int [] numbers) {
? ? ? ? int[] counts = new int[18];
? ? ? ? for (int num:numbers) ? counts[num]++;
? ? ? ? int left,i;
? ? ? ? for (left = 1; left <14; left++) {
? ? ? ? ? ? if (counts[left] != 0) ?break;
? ? ? ? }
? ? ? ? //用left記下最小的一個(gè)非0數(shù)字
? ? ? ? for (i = left + 1; i <= left+4; i++) {
? ? ? ? ? ? if (counts[i] == 0){
? ? ? ? ? ? ? ? if (counts[0] == 0) return false;
? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ?counts[0]--;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return true;
? ? }
/**
@author zhengyanan
@date 2017/3/1 @time 10:25
verison-1:
核心思路:
1.先用一個(gè)長(zhǎng)度為14的數(shù)組,記憶原始數(shù)據(jù),下標(biāo)為值,值為下標(biāo)出現(xiàn)的次數(shù)。
2.按下標(biāo)從小到大找到第一個(gè)不為0的數(shù)counts[i](一定有,因?yàn)橐还?個(gè)數(shù),撐死4個(gè)0)。
3.從counts[i]訪問到counts[i+5]:
如果counts[i] == 0:就counts[0]--,(類比成拿一個(gè)0來頂);如果沒有0可以用來頂,說明沒法構(gòu)成順子,返回false;

如果能順利的訪問完,就說明是順子;

如果不能訪問完,就說明因?yàn)樵L問到了數(shù)組的邊界而提前退出訪問了。(比如 0,0,12,12,13) 這時(shí)我們就需要判斷 已經(jīng)連成的順子的長(zhǎng)度+counts[0]是否==5.
????????如果相等,就可以把0補(bǔ)到最左邊組成順子,true;
????????如果不等,說明有非0的對(duì)子,false;

運(yùn)行時(shí)間:28ms
占用內(nèi)存:503k
*/
// ? ?public boolean IsContinuous(int [] numbers) {
// ? ? ? ?int[] counts = new int[14];
// ? ? ? ?for (int num:numbers) ? counts[num]++;
// ? ? ? ?int left,i;
// ? ? ? ?for (left = 1; left <14; left++) {
// ? ? ? ? ? ?if (counts[left] != 0) ?break;
// ? ? ? ?}
// ? ? ? ?//用left記下最小的一個(gè)非0數(shù)字
//
// ? ? ? ?for (i = left + 1; i <= left+4 && i<14 ?; i++) {
// ? ? ? ? ? ?if (counts[i] == 0){
// ? ? ? ? ? ? ? ?if (counts[0] == 0) return false;
// ? ? ? ? ? ? ? ?else ? ? ? ? ? ? ? ?counts[0]--;
// ? ? ? ? ? ?}
// ? ? ? ?}
//
// ? ? ? ?if (i == left + 5) ?return true;
// ? ? ? ?else{
// ? ? ? ? ? ?if (14 - left + counts[0] == 5) return true;
// ? ? ? ? ? ?else ? ? ? ? ? ? ? ? ? ? ? ? ? ?return false;
// ? ? ? ?}
// ? ?}

編輯于 2017-03-01 11:04:39 回復(fù)(1)
不用sort函數(shù)的:
class Solution {
public:
? ?bool IsContinuous( vector<int> numbers )
{
int len = numbers.size();
if(len == 0)
return false;
int num[14] = {0};
for(int i = 0; i<len ; i++)
{
if( numbers[i] > 0 && num[ numbers[i]] !=0 )
return false;
num[ numbers[i]]++;
}

int dif = 0;
int start = 1,end =13;
? ?while(num[start]!=1)
start++;
? ?while(num[end]!=1)
end--;
dif = end - start +1;?

return dif<=len;
? ? }
};
編輯于 2015-10-03 16:36:24 回復(fù)(1)
1.首先判斷輸入,如果為空數(shù)組或者數(shù)組的長(zhǎng)度不到5位,則直接返回false
2.然后查看數(shù)組中是否有重復(fù)值(0除外),如果有0以外的重復(fù)值,直接返回false
3.如果沒有對(duì)子,需要記錄0的出現(xiàn)次數(shù),同時(shí)要注意如果有4個(gè)0的話直接返回true(一定能構(gòu)成順子)
4.將數(shù)組中的0剔除,再將數(shù)組排序(從小到大),遍歷排序后的值,統(tǒng)計(jì)需要0的個(gè)數(shù)
5.統(tǒng)計(jì)0的算法:相鄰之間的數(shù)如果相差1,則不需要,相差2,需要一個(gè)0,相差3,需要兩個(gè)0,最多相差4,需要3個(gè)0;
6.統(tǒng)計(jì)所有需要0的個(gè)數(shù)是否小于已有0的個(gè)數(shù),如果小于則可以組成順子
該題用了下Collections中的SortedSet省略了排序過程
using?System.Collections.Generic;
using?System.Linq;
class?Solution
{
????public?bool?IsContinuous(int[]?numbers)
????{
????????if(null?==?numbers?||?numbers.Length?<=?4)?return?false;
????????//?write?code?here
????????List<int>?list?=?new?List<int>(numbers);
????????????SortedSet<int>?set?=?new?SortedSet<int>();
????????????int?countZero?=?0;
????????????bool?flag?=?false;
????????????foreach?(var?item?in?list)
????????????{
????????????????flag?=?set.Add(item);
????????????????if?(flag?&&?item?==?0)
????????????????{
????????????????????//第一次加入大小王
????????????????????countZero?=?1;
????????????????}
????????????????//判斷是否有對(duì)子
????????????????else?if?(!flag)
????????????????{
????????????????????//表示不是第一次加入大小王
????????????????????if?(item?==?0)
????????????????????{
????????????????????????countZero++;
????????????????????}
????????????????????else
????????????????????{
????????????????????????//有對(duì)子,不能成為順子
????????????????????????return?false;
????????????????????}
????????????????}
????????????}
????????????//沒有大小王
????????????if?(countZero?==?0)
????????????{
????????????????for?(int?i?=?0;?i?<=?set.Count?-?2;?i++)
????????????????{
????????????????????if?(set.ElementAt(i?+?1)?-?set.ElementAt(i)?>?1)
????????????????????{
????????????????????????return?false;
????????????????????}
????????????????}
????????????????return?true;
????????????}
????????????//有大小王
????????????//有4個(gè)大小王
????????????if?(set.Count?==?1)?return?true;

????????????//記錄需要大小王的個(gè)數(shù)
????????????int?countSub?=?0;
????????????set.Remove(0);
????????????for?(int?i?=?0;?i?<=?set.Count?-?2;?i++)
????????????{
????????????????countSub?+=?(set.ElementAt(i+1)?-?set.ElementAt(i)?-?1);
????????????}
????????????if?(countZero?>=?countSub)?return?true;

????????????return?false;
????}
}



發(fā)表于 2019-12-03 16:36:15 回復(fù)(0)
class Solution:
    def IsContinuous(self, numbers):
        numbers.sort()
        zero = numbers.count(0)
        gap = 0
        if not numbers:
            return False
        for i in range(zero,len(numbers)-1):
            if numbers[i+1] == numbers[i]:
                return False
            gap += numbers[i+1]-numbers[i]-1
        if gap <= zero:
            return True
        return False
編輯于 2018-10-21 20:38:48 回復(fù)(0)

Python solution:

該題利用除0之外,數(shù)字最大最小差<=4并且沒有重復(fù)可以解開

?# 是否有重復(fù)的數(shù)可以利用len(numbers)==len(set(numbers))判斷

def Issamenum(self, numbers):
    for i in numbers:
        if numbers.count(i) != 1 and i != 0:
            return False
    return True

?
def IsContinuous(self, numbers):
    # write code here
    if len(numbers) != 5:
        return False
    while min(numbers) == 0:
        numbers.remove(0)
    if max(numbers) - min(numbers) <= 4 and self.Issamenum(numbers):
        return True
    return False
發(fā)表于 2018-10-11 20:36:42 回復(fù)(0)
import java.util.Arrays;

public class Solution {
? ? public boolean IsContinuous(int [] numbers) {
? ? ? ? if (numbers == null || numbers.length == 0) {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? Arrays.sort(numbers);
? ? ? ? int zeroCount = 0;
? ? ? ? boolean isSuccess = true;
? ? ? ? for (int i = 0; i < numbers.length; i++) {
? ? ? ? ????if (numbers[i] == 0) {
? ? ? ? ????????zeroCount++;
? ? ? ? ????}
? ? ? ? }
? ? ? ? int k = zeroCount;
? ? ? ? for (int i = k; i < numbers.length - 1; i++) {
? ? ? ? ????if (numbers[i+1] - numbers[i] - 1 <= zeroCount && numbers[i+1] != numbers[i]) {
? ? ? ? ????????zeroCount -= numbers[i+1] - numbers[i] - 1;
? ? ? ? ????}
? ? ? ? ????else {
? ? ? ? ????????isSuccess = false;
? ? ? ? ????????break;
? ? ? ? ????}
? ? ? ? }
? ? ? ? return isSuccess;
? ? }
}

發(fā)表于 2018-08-11 13:50:09 回復(fù)(0)
public class Solution {
    public static boolean IsContinuous(int [] numbers) {
        if(numbers.length!=5)
            return false;
        int count = 0;//統(tǒng)計(jì)王的個(gè)數(shù)
        int max = -1;
        int min = 14;
        for(int i = 0;i<numbers.length;i++){
            if(numbers[i]==0){
                count++;
                continue;
            }
            if(numbers[i]>max)
                max = numbers[i];
            if(numbers[i]<min)
                min = numbers[i];
        }
        if(max==min&&count==4)
	        	return true;
        while(max-min!=4&&count>0){
            if(max<5){
                int t = Math.min(count, 5-max);
                max+=t;
                count -= t;
            }else{
                int t = Math.min(count, max-5);
                min -= t;
                count -= t;
            }
        }

        if(min==max-4)
            return true;//最大和最小相差4
        return false;   
    }
}
編輯于 2016-06-14 16:53:19 回復(fù)(12)
import java.util.Arrays;
public class Solution {
    public boolean IsContinuous(int [] numbers) {
        int count=0;
        Arrays.sort(numbers);
        for(int i=0; i<4; i++) {
            if(numbers[i] == 0) count++;
            else if(numbers[i] == numbers[i+1]) return false;
        }
        return numbers[4]-numbers[count]<5;
    }
}
發(fā)表于 2022-08-01 22:31:31 回復(fù)(0)
import?java.util.*;

public?class?Solution?{
????public?boolean?IsContinuous(int?[]?numbers)?{
????????Arrays.sort(numbers);
????????int?zero?=?0;
????????int?gap?=?0;
????????for?(int?i?=?0;?i?<?numbers.length;?i++)?{
????????????if?(numbers[i]?==?0)?{
????????????????zero++;
????????????}?else?{
????????????????if?(i?>?0?&&?numbers[i?-?1]?!=?0?)?{
????????????????????if?(numbers[i]?==?numbers[i?-?1])?{
????????????????????????return?false;
????????????????????}?else?{
????????????????????????gap?+=?numbers[i]?-?numbers[i?-?1]?-?1;
????????????????????}

????????????????}
????????????}
????????}
????????if?(gap?<=?zero)?{
????????????return?true;
????????}?else?{
????????????return?false;
????????}




????}
}

發(fā)表于 2022-06-18 15:01:03 回復(fù)(0)
import java.util.*;

public class Solution {
? ? public boolean IsContinuous(int [] numbers) {
? ? ? ? ? ? //排序
? ? ? ? ? ? Arrays.sort(numbers);
? ? ? ? ? ? //判斷是否有相同的
? ? ? ? ? ? for (int i=4;i>0;i--){
? ? ? ? ? ? ? ? if (numbers[i]==numbers[i-1]&&numbers[i]!=0)
? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ??
? ? ? ? ? ? //遇到0,temp-1,相當(dāng)于可以頂替一個(gè)缺失數(shù)字
? ? ? ? ? ? int temp=0;
? ? ? ? ? ? for (int i=3;i>=0;i--){
? ? ? ? ? ? ? ? if (numbers[i]==0)
? ? ? ? ? ? ? ? ? ? temp-=1;
? ? ? ? ? ? ? ? else?
? ? ? ? ? ? ? ? ? ? temp=temp+numbers[i+1]-numbers[i]-1;
? ? ? ? ? ? }
? ? ? ? ? ? return temp<=0?true:false;
? ? }
}
發(fā)表于 2022-03-21 23:59:24 回復(fù)(0)