一个很有意思的题目,思想就是判断这个字符串变成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));
}
}