2018 招行编程题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jcsyl_mshot/article/details/81749708

招行题目一:
题目描述:
小招喵喜欢在数轴上跑来跑去,假设它现在站在点n处,它只会3种走法,分别是:
1.数轴上向前走一步,即n=n+1;
2.数轴上向后走一步,即n=n-1;
3.数轴上使劲跳跃到当前点的两倍,即n=2*n
现在小招喵在原点,即n=0,它想去点x处,快帮小招喵算算最快的走法需要多少步?

解析:主要注意的点就是条件的判断
如果dp[i+1]已经求出来了,那么dp[i]就是dp[i-1]和dp[i+1]的较小者+1
如果dp[i+1]没有求出来了,那么dp[i]就是dp[i-1]+1

import java.util.Scanner;
public class leastStep {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int pos = Math.abs(in.nextInt());

        int num = 2*pos+1;
        int[] dp = new int[num];
        for(int i=0;i<dp.length;i++)
            dp[i]=0;

        dp[0]=0;
        for(int i=1;i<=pos;i++) {
            if(i%2==0){
                dp[i]=Math.min(dp[i-1]+1, dp[i/2]+1);
            }
            else {
                dp[i]=Math.min(dp[i-1]+1, dp[i+1]+1);
            }
            dp[2*i]=dp[i]+1;
        }
        System.out.print(dp[pos]);

}

//  def count(n):
//      if n<0:
//          n = -n
//      if n==0:
//          return 0
//      if n==1:
//          return 1
//      if n%2==0:
//          return count(n//2)+1
//      else:
//          r1 = count((n+1)//2)+2
//          r2 = count((n-1)//2)+2
//          return min(r1,r2)

招行题目二:
给出一个整数n,将n分解为至少两个整数之和,使得这些整数的乘积最大化,输出能够获得的最大的乘积。
例如:

//动态规划 减绳子
import java.util.Scanner;

public class maxProduct {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int number = in.nextInt();

        int product = getMaxProduct(number);
        System.out.print(product);
    }

    private static int getMaxProduct(int number) {
        // TODO Auto-generated method stub
        if (number==1)
            return 0;
        if(number==2)
            return 1;
        if(number==3)
            return 2;
        int total=number+1;
        int[] dp = new int[total];
        dp[1]=1;
        dp[2]=2;
        dp[3]=3;
        for(int i=4;i<=number;i++) {
            int max=0;
            for(int j=1;j<=i/2;j++) {
                int newMax = dp[j]*dp[i-j];
                if(newMax>=max)
                    max = newMax;
            }
            dp[i]=max;
        }
        return dp[number];  
    }
}

招行题目三:
给出一个正整数n,请给出所有的包含n个’(‘和n个’)’的字符串,使得’(‘和’)’可以完全匹配。
例如:
‘(())()’,’()()()’ 都是合法的;
‘())()(‘是不合法的。
请按照字典序给出所有合法的字符串。

解析:全排列问题,递归解决。这里满足条件都可以进行递归操作,而大部分递归问题时候往往选择其中一种条件下进行递归

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        ArrayList<String> arr = new ArrayList<>();

        DFS(N,N,arr,"");
        for(int i=0;i<arr.size();i++){
            if(i!=arr.size()-1)
                System.out.print(arr.get(i)+',');
            else
                System.out.print(arr.get(i));
        }
    }

    private static void DFS(int n, int n2, ArrayList<String> arr,String str) {
        // TODO Auto-generated method stub
        if(n==0 && n2==0){
            arr.add(str);
            return ;
        }

        if(n>0 && n<=n2)
            DFS( n-1,n2,arr,str+'(');
        if(n2>0 && n<=n2)
            DFS(n,n2-1,arr,str+')');
    }

}

猜你喜欢

转载自blog.csdn.net/jcsyl_mshot/article/details/81749708
今日推荐