20瓶药中的药外形一样,其中一瓶每颗药的重量比其他的重0.01,给你一个没有砝码的天平,怎么快速找出重量不一样的那瓶?
爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。
最后一步可能垮了1步,也可能跨了两步,所以:
f(n) = f(n - 1) + f(n - 2);
f(0) = 1
f(1) = 1
f(2) = 2
f(3) = f(2) + f(1) = 3
f(4) = f(3) + f(2) = 5
...
根据已知推未知:
/**
* @param {number} n
* @return {number}
*/
var climbStairs = function(n) {
let p = 0;
let q = 0;
let r = 1;
for(let i = 1; i <= n; i++){
p = q;
q = r;
r = p + q;
}
return r;
};
回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
/**
* @param {string} s
* @return {number}
*/
var countSubstrings = function(s) {
let count = 0;
let n = s.length;
for(let i = 0; i < 2 * n - 1; i++){
let l = Math.floor(i / 2);
let r = Math.floor(i / 2) + i % 2;
while(i >= 0 && r < n && s.charAt(l) === s.charAt(r)){
l--;
r++;
count++;
}
}
return count;
};
l、r为中心点位置,回文串长为奇数则l=r,回文串长为偶数则r=l+1,2n-1为中心点组数。如“dfgdg”的中心点有:
0 - 0
0 - 1
1 - 1
1 - 2
2 - 2
2 - 3
3 - 3
3 - 4
4 - 4
while判断为中心点相等,可以继续向外扩展比较
吃香蕉
/**
* @param {number[]} piles
* @param {number} H
* @return {number}
*/
var minEatingSpeed = function(piles, H) {
let maxVal = Math.max(...piles);
let low = 1;
let high = maxVal;
while(low < high) {
const mid = Math.floor((high + low) / 2);
if(getTime(piles, mid) > H){
low = mid + 1;
}else{
high = mid;
}
}
return low;
};
function getTime(piles, k) {
return piles.reduce((total, cur) => {
return total + Math.ceil(cur / k);
}, 0);
}