2020-09-27每日复习

1275.找出井字棋的获胜者

在这里插入图片描述在这里插入图片描述在这里插入图片描述
分析

  • 获胜只有八种方式,即三行、三列、正负对角线。九宫格代表九位二进制,00第一位,01第二位,02第三位,10第四位…22第九位。所以八种获胜方式即代表八个九位二进制数,如第一行所表示的二进制为000000111,等于十进制的7。故将八种获胜方式所对应的二进制存进一个数组。
  • 偶数位是A下棋的步骤,奇数位是B下棋的步骤,棋下在哪个位置,就要异或的方式把相应位置1。最后把两者与数组中的每一位相与,若相与后等于原来的数,即说明这两个数相等,故就以这种方式获胜。
  • 若以上两者都没有,则看数组中是不是有9个数,若有9个数,即说明平局,否则可以继续下。
class Solution {
    public String tictactoe(int[][] moves) {
        int a = 0, b = 0, len = moves.length;
        int[] arr = {7, 56, 448, 73, 146, 292, 273, 84};
        for(int i = 0; i < len; i++){
            if((i & 1) == 1){
                b ^= 1 << (3 * moves[i][0] + moves[i][1]);
            }else{
                a ^= 1 << (3 * moves[i][0] + moves[i][1]);
            }
        }
        for(int i : arr){
            if((a & i) == i) return A;
            if((b & i) == i) return B;
        }
        return len == 9 ? "Draw" : "Pending";
    }
}

在这里插入图片描述

1566.重复至少 K 次且长度为 M 的模式

在这里插入图片描述在这里插入图片描述
分析

  • 长度为m重复次数为k,则重复的数字总共有mk个。故用长度为mk的窗口去滑动,判断此窗口内是否符合要求,若符合则存在,不符合则继续循环,直到最后。
  • 滑动窗口为i——i+m*k,再去判断窗口内的元素,若窗口内的元素都等于窗口中第一组元素的值,则说明存在,若有不等于,则进入下一循环,直到最后。
class Solution {
    public boolean containsPattern(int[] arr, int m, int k) {
        int len = arr.length;
        for(int i = 0; i + m * k <= len; i++){
            boolean flag = true;
            for(int j = i; j < i + m * k; j++){
                if(arr[j] != arr[i + (j - i) % m]){
                    flag = false;
                    break;
                }
            }
            if(flag) return true;
        }
        return false;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值