剑指Offer 3.1

82 阅读1分钟

剑指 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;
};