LeetCode210512最大分组的位置和反转图像

最大分组的位置

思路:
定义初始出现数量为1,从左向右遍历,如果后一个和当前的字符不相同,紧接着立刻判断当前数量如果大于2,也就是大于等于3时,使用Arrays工具将自定义一个数组转换成集合保存在大集合嵌套的集合中。之后再将count数量置为1。如果当前字符和后一个字符相同,则count数量++。这里注意当遍历到最后一个字符时,就必须直接进入一个if判断。也就是最后一个字符没有下一个字符的特殊情况。故使用或连接。if(i==n-1 || s.charAt(i)!=s.charAt(i+1))

	public static List<List<Integer>> method(String s) {
        ArrayList<List<Integer>> list = new ArrayList<>();
        int count = 1;
        int n = s.length();

        for (int i = 0; i < n; i++) {
            if (i == n - 1 || s.charAt(i) != s.charAt(i + 1)) {
                if (count > 2) {
                    list.add(Arrays.asList(i - count + 1, i));
                }
                count = 1;

            } else {
                count++;

            }

        }
        return list;
    }

反转图像

思路:
本题用到位运算中的按位异或。首先循环遍历二维数组中的每一行,这里默认行数等于列数,在每一行的循环中定义左指针和右指针,左指针指向第一个元素,右指针指向最后一个元素。在左指针小于右指针的情况下,当左指针指向的元素等于右指针指向的元素时,将左指针的元素进行和1异或的运算。将右指针指向的元素也进行和1异或的运算。为什么?因为先水平对称翻转处理,但这两个数是相等的, 你不管怎么翻转最后这两个数不会变化。如1,0,0,1水平翻转后仍是1001,故只需进行题目需求的反转操作。若想反转,就做异或运算。
情况二,如果左指针指向的元素和右指针不同,什么都不做,为什么?因为如果左右指针所指值不同,即有一个是0另一个是1,水平再反转,终不变!
之后再两种情况都需要左指针后移,右指针前移。到最终,再判断如果是奇数个情况,中心元素值必须做反转处理,即和1按位异或运算。

	public static int[][] method(int[][] arr){
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            int left = 0;
            int right = n-1;
            while (left < right) {
                if (arr[i][left] == arr[i][right]){
                    arr[i][left]^=1;
                    arr[i][right]^=1;
                }else {
                    // 如果左右不相等,即有一个是0另一个是1,水平再反转,终不变
                }
                left++;
                right--;
            }
            if (left == right) {
                arr[i][left] ^= 1; // 如果原是1,1^1是0,如果原是0,0^1是1。
            }
        }
        return arr;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值