9.18晚上网易笔试交流,想问下自己的思路哪里有问题
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.next();
int n = str.length();
int m = in.nextInt();
int[] ds = new int[n-1];
for(int i=0;i<n-1;++i){
ds[i] = dis(str.charAt(i),str.charAt(i+1));
}
int sum = 1;
for(int i=0;i<n-1;++i){
sum+=ds[i];
sum++;
}
if(m==0){
System.out.println(sum);
return;
}
int[] ds_sum = new int[n];
ds_sum[0] = 0;
for(int i=1;i<=m;++i){
ds_sum[i] = ds_sum[i-1]+ds[i-1];
}
for(int i=m+1;i<n;++i){
ds_sum[i] = ds_sum[i-1]+ds[i-1];
ds_sum[i] -= ds_sum[i-m];
}
int max = 0;
for(int i=m;i<n;++i){
max = Math.max(max,ds_sum[i]);
}
if(max>m){
sum -= (max-m);
}
System.out.println(sum);
}
public static int dis(char c1,char c2){
int d = Math.abs((int)c2-(int)c1);
d = Math.min(26 - d, d);
return d;
}
} 这是第二题,思路就是计算连续m个字符间距离最大的一组,让这一组使用魔法移动,但是通过率只有六成左右import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long s = in.nextLong();
long ss = s;
if(s==0){
System.out.println(-1);
return;
}
long p = 1;
while((long)(2)*p<=s){
p = (long)(2)*p;
}
ArrayList<Integer> binary = new ArrayList<Integer>();
while(p>(long)0){
if((long)s>=(long)p){
s = s-p;
binary.add(1);
}else{
binary.add(0);
}
p = p/(long)2;
}
int res1 = 0;
for (Integer integer : binary) {
if (integer == 1) {
res1++;
}
}
if(ss%(long)2==1){
System.out.println(res1);
return;
}
int res2 = 0;
int firstone = binary.size();
for(int i=binary.size()-1;i>-1;--i){
if(binary.get(i)==1){
firstone = i;
res2 = 2;
break;
}
}
for(int i=firstone;i>-1;--i){
if(binary.get(i)==0){
res2++;
}
}
System.out.println(Math.min(res1, res2));
return;
}
} 这是第三题,思路是两种方案比较最小值。二进制化,方案一是直接数1的数量(作和),方案二是计算最右边的1左边0的数量,然后+2(把最右边的1左边的0全部补为1,最右边为1的位再加1得到一个100...000,逆向这个过程就是结果),但只有七成通过率

