首页 > 9.18晚上网易笔试交流,想问下自己的思路哪里有问题
头像
ayanokouji97
编辑于 2021-09-18 23:23
+ 关注

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









全部评论

(1) 回帖
加载中...
话题 回帖