剑指offer-数组

剑指 Offer 61. 扑克牌中的顺子

  • 思路:
  1. 本题就是想判断是否有序,因为是顺子,只需要大一个大小关系即可。(示例2:[0,0,1,2,5]这也是一个顺子)
  2. 将数组进行排序。可能会有大小王,设置一个标志,因为大小王是0,那么在遍历的时候,找到大小王的位置,从最后一个大小王的位置进行判断是否为顺子即可。
  3. 如果在遍历的过程中有重复的数,那么就不是顺子了。
  4. 最后判断数组最后一个数减去大小王之后的数差值是否在五以内(因为数值长度只有5)
  • 代码:
class Solution {
    public boolean isStraight(int[] nums) {
        Arrays.sort(nums);
        int boss = 0;
        for(int i = 0; i < nums.length - 1; i++){
            if(nums[i] == 0){
                //大小王要跳过
                boss++;
            }else if(nums[i] == nums[i + 1]){
                return false;
            }
        }
        return nums[nums.length - 1] - nums[boss] < 5;
    }
}

剑指 Offer 57 - II. 和为s的连续正数序列

  • 思路:
    参考题解
    在这里插入图片描述
    上图很好的说明了问题,给一个双指针,初始位置在第一个数字和第二个数字上,并设置一个初始和为3(因为1 + 2 = 3),判断元素和与目标值的关系,如果小了,那么就移动右边指针(先计算元素和,再进行指针),大了就移动左边指针(先移动指针,再机加上新元素值)。如果元素和正好和目标值一样,那么就创建一个数组,大小就是j - i + 1,并记录[i,j]之间的值,添加完成之后添加到res里面。

  • 代码:

class Solution {
    public int[][] findContinuousSequence(int target) {
        int i = 1, j = 2, s = 3;
        List<int[]> res = new LinkedList<>();
        while(i < j){
            if(s == target){
                int[] ans = new int[j - i + 1];
                for(int k = i; k <= j; k++){
                    ans[k - i] = k;
                }
                res.add(ans);
            }
            if(s >= target){
                s -= i;
                i++;
            }else {
                j++;
                s += j;
            }

        }
        return res.toArray(new int[0][]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值