版权声明:本文为博主原创文章,未经博主允许不得转载。 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+')');
}
}