一、用 JavaScript 写一个函数,输入 int 型,返回整数逆序后的字符串。如:输入整型 1234,返回字符串“4321”。要求必须使用递归函数调用,不能用全局变量,输入函数必须只有一个参数传入,必须返回字符串。
function reverseInt(num) {
if (num < 10) {
return num;
}
var remainder = num % 10;
var result = parseInt(num / 10);
console.log(result, remainder);
return remainder.toString() + reverseInt(result);
}
二、你有三种硬币,分别面值2元,5元和7元,每种硬币足够多,买一本书需要27元,如何用最少的硬币组合正好付清,不需要对方找钱?
var A = [2, 5, 7];
var M = 27;
function coinCange(A, M) {
var f = new Array(M + 1);
var n = A.length;
f[0] = 0;
for (var i = 1; i <= M; i++) {
f[i] = Infinity;
for (var j = 0; j < n; j++) {
if (i >= A[j] && f[i - A[j]] !== Infinity) {
f[i] = Math.min(f[i - A[j]] + 1, f[i]);
}
}
}
if (f[M] == Infinity) {
f[M] = -1;
}
return f[M];
}
console.log('最少组合', coinCange(A, 1));
console.log('最少组合', coinCange(A, 2));
console.log('最少组合', coinCange(A, 5));
console.log('最少组合', coinCange(A, 7));
console.log('最少组合', coinCange(A, 27));
三、求最值型动态规划
一、动态规划组成部分:
1、确定状态
最后一步(最优策略中使用的最后一枚硬币A)
化成子问题(最少的硬币拼出更小的面值27-A)
2、转移方程
f[X] = min{f[X-2]+1, f[X-5]+1, f[X-7]+1}
3、初始化条件和边界情况
f[0] = 0, 如果不能拼出Y,f[Y]=正无穷
4、计算顺序
f[0], f[1], f[2], ...
二、消除冗余,加速计算
四、给定m行n列的网格,有一个机器人从左上角(0,0)出发,每一步可以向下或者向右走一步,问有多少种不同的方式走到右下角?
function uniquePaths(m, n){
var f = [];
for(var i = 0; i < m; i++){
f[i] = new Array();
for(var j = 0; j < n; j++){
if(i==0 || j==0){
f[i][j] = 1;
}else{
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
}
return f[m-1][n-1];
}
console.log('共有', uniquePaths(3, 4), '种方式');
console.log('共有', uniquePaths(1, 1), '种方式');
console.log('共有', uniquePaths(2, 2), '种方式');