《剑指Offer》JS题解——JZ11~15

197 阅读2分钟

前言

又是每日一刷,既然没人看那我就开启自嗨式写法。

JZ11 二进制中1的个数

题目

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

解法

顺便复习下如何用js十进制转二进制:

parseInt(n).toString(2)

这题一开始也挺蒙的,后面看了高人指点,能够领略一二,有种玩数竞的感觉。

1100 减去1后 -》1011.

可以发现减1的结果是把最右边的一个1开始的所有位都取反了。

这个时候如果我们再把原来的整数和减去1之后的结果做与运算:1100&1011=1000.

也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.

那么一个整数的二进制有多少个1,就可以进行多少次这样的操作

function NumberOf1(n)
{
    // write code here
    var count = 0;
    while(n)
    {
        n = n & (n-1);
        count++;
    }
    return count;
    
}

xiaolv

JZ12 数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

保证base和exponent不同时为0

答案

解法一

pow函数的简单实现

  /**
   * @return {number}
   */
  function Power(base, exponent) {
      // write code here
      if (exponent === 0) {
          return 1;
      } else if (exponent === 1) {
          return base;
      }
      let ret = base;
      if (exponent > 0) {
          for (let i = 1; i < exponent; i++) {
              ret *= base;
          }
          return ret;
      } else {
          for (let i = 1; i < Math.abs(exponent); i++) {
              ret *= base;
          }
          return 1 / ret;
      }
  }

解法二

应用ES6最新运算符 **

function Power(base, exponent)
{
    // write code here
    return base**exponent;
}

JZ13 调整数组顺序使奇数在偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解法一

开两个数组分别记录

function reOrderArray(array)
{
    let oddArray = [];
        let evenArray = [];
        for(let i = 0; i < array.length; i++)
        {
            if(array[i]%2 === 0){
                evenArray.push(array[i]);
            }else{
                oddArray.push(array[i]);
            }
        }
        return oddArray.concat(evenArray);
}

解法二

相当于一个特殊条件判断的插入排序.是奇数的话把他插入到前面,其余数字后移

function reOrderArray2(array) {
    let k = 0;
    for(let i = 0; i < array.length; i++)
    {
        let tmp = array[i];
        if(tmp & 1){//是奇数
            for(let j = i - 1; j >= k; j--)//到已经排序好的为止
            {
                array[j+1] = array[j];
            }
            array[k++] = tmp;
        }
    }
    return array;
}
console.log(reOrderArray2([1,2,3,4,5,6]))

JZ14 链表中倒数第k个节点

题目描述

输入一个链表,输出该链表中倒数第k个结点。

解法

快慢指针,相距k个,那么快指针到末尾时,慢指针的位置便是倒数k个

function FindKthToTail(head, k) {
    if (!head || k < 1) return null;
    let slowptr = head;
    let fastptr = head;
    let count = 0;
    while (fastptr != null && count < k) {
        count++;
        fastptr = fastptr.next;
    }
    if (count < k) return null;//k的取值超过了链表本身的长度
    while (fastptr != null) {
        fastptr = fastptr.next;
        slowptr = slowptr.next;
    }
    return slowptr;
}

JZ15 反转链表

题目描述

输入一个链表,反转链表后,输出新链表的表头。

解答

基本思路,保存当前指针.next.next,再将当前指针.next指向当前指针,然后前移

function ReverseList(pHead) {
    // write code here
    if (!pHead) return null;
    if (!pHead.next) return pHead;
    let p1 = pHead;
    let p2 = pHead.next;
    p1.next = null;
    let temp;
    while (p2 != null) {
        temp = p2.next;
        p2.next = p1;
        p1 = p2;
        p2 = temp;
    }
    return p1;
}