剑指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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章