1、给出一组数列:1,2,6,15,31,56…, 求第n个数。
1.1 解题思路
类似斐波那契数列,可以用双指针移动来解题。
1.2 参考代码
// 1,2,6,15,31,56.. 求 第 n 个 数
function getNthNumber(n) {
let res = 1;
let n1 = 0;
let n2 = 1;
for (let i = 1; i <= n; i++) {
res = n2 + Math.pow(i - 1, 2)
n1 = n2;
n2 = res;
}
return res
}
console.log(getNthNumber(1));
console.log(getNthNumber(2));
console.log(getNthNumber(3));
console.log(getNthNumber(4));
console.log(getNthNumber(5));
console.log(getNthNumber(6));
console.log(getNthNumber(7));
2.小明去赌钱,每次都押现有钱的一半,假设他参与了 2n 场,赢了 n 场,输了 n 场,问最终小明是赢了还是输了?
2.1 解题思路
我们可以用代码来模拟小明的赌钱策略,并计算最终是赚还是亏。关键点是赢的情况下钱加倍,输的情况下减半。在 2𝑛场中,赢了 𝑛 场,输了 𝑛 场,最终的结果只与赢输的顺序无关。
2.2 参考代码
function calculateOutcome(initialMoney, n) {
let money = initialMoney;
// 模拟 n 场赢,n 场输
for (let i = 0; i < n; i++) {
money *= 2; // 赢了钱加倍
}
for (let i = 0; i < n; i++) {
money /= 2; // 输了钱减半
}
// 返回最终的钱和赚亏状态
return {
finalMoney: money,
result: money > initialMoney ? '赚了' : (money < initialMoney ? '亏了' : '持平')
};
}
// 测试
const initialMoney = 100; // 初始资金
const n = 3; // 假设赌了 6 场,赢了 3 场,输了 3 场
const outcome = calculateOutcome(initialMoney, n);
console.log(`初始资金: ${initialMoney}`);
console.log(`最终资金: ${outcome.finalMoney}`);
console.log(`结果: ${outcome.result}`);
运行结果
无论赢输顺序如何,小明最终资金与初始资金相同,结果为持平。
答案
小明最终不赚也不亏,因为每次押一半的策略使得资金在赢输数量相同的情况下保持恒定。
3.小明花零花钱, 第一天花所有钱的一半多1块,第二天花前一天的钱的一半多一块,依次类推,第n天后小明刚好剩 1块,问小明有多少零花钱?
3.1 解题思路
我们可以用逆推法解决这个问题:
- 从第 𝑛 天向第 1 天逆推小明的零花钱。
- 每天剩下的钱可以反推计算出前一天的钱。
3.2 参考代码
function calculateInitialMoney(days) {
let money = 1; // 第 n 天剩余的钱是 1 块
for (let i = days; i > 0; i--) {
money = (money + 1) * 2; // 根据公式逆推前一天的钱
}
return money;
}
// 测试
const days = 5; // 假设小明花了 5 天
const initialMoney = calculateInitialMoney(days);
console.log(`小明刚开始有零花钱: ${initialMoney} 块`);
3.3示例运行
假设 𝑛=5:
- 第 5 天剩下的钱:1 块
- 第 4 天的钱:(1+1)×2=4
- 第 3 天的钱:(4+1)×2=10
- 第 2 天的钱:(10+1)×2=22
- 第 1 天的钱:(22+1)×2=46
输出:小明刚开始有 46 块零花钱。