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,逆向这个过程就是结果),但只有七成通过率