2019拼多多内推算法岗笔试

1数组山谷

数组里的山谷是指一个数组A中的连续子数组B满足以下条件:

(1)B.length>=3;

(2)存在满足:0<i<B.length-1并且B[0]>B[1]>...>B[i-1]>B[i]<B[i+1]<...<B[B.length-1];

现给定一个整形数组A,找出数组A里的最长山谷B的长度,如果没有,则输出0.

public static int longestMountain(int[] A) {
        int res = 0, up = 0, down = 0;
        for (int i = 1; i < A.length; ++i) {
            if (up > 0 && A[i - 1] > A[i] || A[i - 1] == A[i])
                up = down = 0;
            if (A[i - 1] < A[i])
                up++;
            if (A[i - 1] > A[i])
                down++;
            if (up > 0 && down > 0 && up + down + 1 > res)
                res = up + down + 1;
        }
        return res;
    }

2字符串构造

有一个长度为n的字符串P,我们可以通过P构造出一个无限长度的字符串S,其中S[i]=P[i%n]。给定一个字符串S,求可以通过上述方法构造出S的最短字符串P。

public static void test2(String s){

        for(int i=1;i<s.length();i++){
            String str=s.substring(0,i);
            StringBuffer temp=new StringBuffer("");
            for(int j=0;j<s.length()/i;j++)
                temp.append(str);
            temp.append(s.substring(0,s.length()%i));
            if(temp.toString().equals(s)) {
                System.out.println(str);
                break;
            }
        }
    }

3二维生物的旅行

二维生物hip当前处于x轴的0坐标位置,打算去拜访它的老友hop,hop位于坐标轴的target位置。hip有一个很奇怪的能力,其迈出的第n步(从1算起),步长为n。也就是说第一步可以移动的距离为1,第二步可以移动的距离为2,以此类推。每走一步之前,hip都可以决定这一步是向左走还是向右走,但每一步都只能朝一个方向前进。二维生物都很懒,hip希望你能先帮他计算出最少需要走多少步才能到达target位置,他再决定要不要去拜访老友。

输入描述:

每个测试输入包含1个测试用例,即给出目标位置target的值。这里保证-10^9<=target<=10^9,且为整数

public static int test3(int target){
        int n=Math.abs(target);
        int k=(int)Math.ceil((Math.sqrt(8*n+1)-1)/2);
        int total=k*(k+1)/2;
        int d=total-n;
        if(d%2==0)
            return k;
        else if(d+k+1%2==0)
            return k+1;
        else
            return k+2;
    }

4靓号

A国手机号码由且仅由N位十进制数值(0-9)组成。一个手机号码中有至少K位数字相同则被定义为靓号。A国的手机号可以有前导零,比如000123456是一个合法的手机号。小多想花钱将自己的手机号码修改为一个靓号。修改号码中一个数字需要花费的金额为新数字与旧数字之间的差值。比如将1修改为6或6修改为1都需要花5块钱。给出小多现在的手机号码,问将其修改成一个靓号,最少需要多少钱?

输入描述:

第一行包含两个整数N,K,分别表示手机号码数字个数以及靓号至少有K个数字相同。

第二行包含N个字符,每个字符都是一个数字,数字之间没有任何其他空白符。表示小多的手机号码。

数据范围2<=K<=N<=10000

输出描述:

第一行包含一个整数,表示修改成一个靓号,最少需要的金额。

第二行包含N个数字字符,表示最少花费修改的新手机号。若有多个靓号花费都最少,则输出字典序最小的靓号。

public static void test4(){
        Scanner scanner=new Scanner(System.in);
        int N=scanner.nextInt();
        int K=scanner.nextInt();
        String s=scanner.next();
        StringBuffer ans=null;
        int res=(int)1e9;
        for(int i=0;i<10;i++){
            StringBuffer t=new StringBuffer(s);
            int p=K,c=0;
            for(int j=0;j<10;j++){
                for(int l=0;l<N;l++){
                    if(p!=0&&t.charAt(l)-'0'==i+j){
                        p--;
                        t.setCharAt(l,(char)(i+'0'));
                        c=c+j;
                    }
                }
                if(j!=0)
                    for(int l=N-1;l>=0;l--)
                        if(p!=0&&t.charAt(l)-'0'==i-j){
                            p--;
                            t.setCharAt(l,(char)(i+'0'));
                            c=c+j;
                        }
            }
            if(c<res){
                res=c;
                ans=t;
            }
            if(c==res){
                ans=ans.toString().compareTo(t.toString())>0?t:ans;
            }

        }
        System.out.println(res);
        System.out.println(ans);
    }

猜你喜欢

转载自blog.csdn.net/wuyifan1115/article/details/81163285