劍指offer-20200321

20200321

題目 :撲克牌中的順子

從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。2~10爲數字本身,A爲1,J爲11,Q爲12,K爲13,而大、小王爲 0 ,可以看成任意數字。A 不能視爲 14。

示例:

輸入: [0,0,1,2,5]
輸出: True

思路 :利用桶排序找出給定數組的最大、最小值。

code

class Solution{
    public boolean isStraight(int[] nums){
        int[] arr = new int[14];
        
        //把每個數放入桶裏,以便找出最大、小值
        for(int i=0;i<5;i++){
            arr[nums[i]]++;
            //如果有非零的重複值則false
            if(nums[i]!=0&&arr[nums[i]]>1){
                return false;
            }
        }
        int min = -1;
        int max = 14;
        
        //找出最小數,從1開始
        for(int i=1;i<14;i++){
            if(arr[i] == 1){
                min = i;
                break;
            }
        }
        
        for(int i=13;i>0;i--){
            if(arr[i] == 1){
                max = i;
                break;
            }
        }
        return max - min <= 4;
    }
}

題目 :圓圈中最後剩下的數字

0,1,…,n-1這n個數字排成一個圓圈,從數字0開始,每次從這個圓圈裏刪除第m個數字。求出這個圓圈裏剩下的最後一個數字。

例如,0、1、2、3、4這5個數字組成一個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2、0、4、1,因此最後剩下的數字是3。

思路 :通過求餘可以形成環

code

class Solution{
    public int lastRemaining(int n, int m){
        if(n==0 || m==0){
            return -1;
        }
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<n;i++){
            list.add(i);
        }
        int c=(m-1)%n;
        while(list.size()!=1){
            list.remove(c);
            c = (c + m-1)%list.size();
        }
        return list.get(0);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章