算法日常训练11.29

 一个很有意思的题目,思想就是判断这个字符串变成0101...或者1010...这两种其中一种的操作步数,然后取小的值,简单的题目都把我几斤几两表现出来了

 我写的:

class Solution {
    public int minOperations(String s) {
        int change1=0;//与0101。。。比较要变化的次数
        int change2=0;//与1010。。。比较要变化的次数
        for(int i=0;i<s.length();i++){
            if(i%2==0){
                if(s.charAt(i)=='0')
                change1++;
                else
                change2++;
            }
            else{
                if(s.charAt(i)=='0')
                change2++;
                else
                change1++;
            }
        }
        return Math.min(change1,change2);
    }
}

 题解写的:

class Solution {
    public int minOperations(String s) {
        int cnt = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c != (char) ('0' + i % 2)) {
                cnt++;
            }
        }
        return Math.min(cnt, s.length() - cnt);
    }
}

大哥写的:

class Solution {
   public int minOperations(String s) {
       int a = 0, b = 0, n = s.length();
       char[] arr = s.toCharArray();
       for (int i = 0; i < n; i++) a += arr[i] ^ '0' ^ (i & 1);// 01010101  
       return Math.min(a, n - a);
   }
}

这水平差别一下子就出来了,我的方法就是垃圾。首先题解的方法,多想到的是变成0101或者1010这种需要的步数加起来是等于字符串的长度的,并且他也不加if(i%2==1)这种傻语句,直接判断‘0’+i%2;奇数位和偶数位显然在01交替进行了,而第三种方法i&1替代了i%2,位与计算,i的最后一位一直是01交替,如果i&1为0,代表是需要为0的位置,那么arr[i]不为‘0’的话,异或以后就为1,正好代表需要变化的位置,被a加上去,如果为‘0’异或他本身就是0,不需要改变,正好加上0,有点巧妙,反正不是我能写出来的,看看差不多。


 

 使用的属于是偷鸡法了,把所有2的n次方排序保存在set中,把n排序,判断他是否在set里就好了,注意为什么判断i>0,因为i越界以后就成负数了。

 

class Solution {
    public boolean reorderedPowerOf2(int n) {
        Set<String> set=new HashSet<>();
        for(int i=1;i>0;i<<=1){
            char[] arr=String.valueOf(i).toCharArray();
            Arrays.sort(arr);
            set.add(new String(arr));
        }
        char[] arr=String.valueOf(n).toCharArray();
        Arrays.sort(arr);
        return set.contains(new String(arr));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值