剑指 Offer 44. 数字序列中某一位的数字
// 只有我能看懂的写法....
var findNthDigit = function(n) {
if(n<10) return n;
let start = 1,digit = 1,nums = 9,count = 9;
while(n>count){
n -= count;
start = start*10;
digit += 1;
nums = start*9;
count = nums*digit;
}
let num = Math.floor(n/digit);
// 从start开始的第几个数,如果刚好能整除
// 则刚好是最后一个数的最后一位
// 如果不能被整除,就是下一个数的plus位
// 对应位置索引的plus-1
let plus = n%digit;
start += plus==0?num-1:num;
let res = String(start);
return plus==0?Number(res[res.length-1]):Number(res[plus-1]);
};
// 别人更加清晰的写法,最后两行的优化(找规律)
var findNthDigit = function(n) {
if(n<10) return n;
let start = 1,digit = 1,nums = 9,count = 9;
while(n>count){
n -= count;
start = start*10;
digit += 1;
nums = start*9;
count = nums*digit;
}
let num = start+Math.floor((n-1)/digit);
return Number(String(num)[(n-1)%digit]);
};
剑指 Offer 51. 数组中的逆序对
// 归并排序,我居然写出来了。。。。
var reversePairs = function(nums) {
let count = 0;
let helper = (l,r)=>{
if(l>r) return;
if(l==r) return [nums[l]];
let mid = Math.floor((l+r)/2);
const left = helper(l,mid);
const right = helper(mid+1,r);
let res = [];
for(let i = 0,j=0;i<left.length||j<right.length;){
if(i==left.length){
res.push(right[j++]);
}
else if(j==right.length){
res.push(left[i++]);
}
else if(left[i]>right[j]){
count += left.length-i;
res.push(right[j++]);
}
else{
res.push(left[i++]);
}
}
return res;
}
helper(0,nums.length-1);
return count;
};
漏了一题 剑指 Offer 65. 不用加减乘除做加法
// 注意运算符优先级,需要加括号
var add = function(a, b) {
while(b){
let c = (a&b)<<1;
a ^= b;
b = c;
}
return a;
};