剑指offer11-20(JavaScript)

11、二进制中1的个数

题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路:n>0时先转换成字符串,再添加前导0构成32位二进制数,循环计数1的个数;

           n<0时先转换成字符串,添加前导0构成32位二进制数,然后将0变成1,1变成0(相当于取反),转换成整数并加一,然后再次转换成字符串并记录1的个数。

function NumberOf1(n)
{
    if(n===0){
        return 0;
    }
    else if(n>0){
        var str=n.toString(2);
        str=str.padStart(32,0);
        var num=0;
        for(var i=0;i<str.length;i++){
            if(str[i]==='1'){
                num++;
            }
        }
        return num;
    }
    else{
        n=-n;
        var str2=n.toString(2);
        str2=str2.padStart(32,0);
        var str3='';
        for(var j=0;j<str2.length;j++){
            if(str2[j]==='0'){
                str3+='1';
            }
            else{
                str3+='0';
            }
        }
        var number=parseInt(str3,2);
        number=number+1;
        var s=number.toString(2);
        var num=0;
        for(var k=0;k<s.length;k++){
            if(s[k]==='1'){
                num++;
            }
        }
        return num;
    }
}
12、数值的整数次方

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

思路:循环乘法代替指数运算,指数为负数时要取倒数。

function Power(base, exponent)
{
    if(exponent===0){
        return 1;
    }
    else if(exponent>0){
        var b=1;
        for(var i=0;i<exponent;i++){
            b=b*base;
        }
        return b;
    }
    else{
        exponent=-exponent;
        var c=1;
        for(var i=0;i<exponent;i++){
            c=c*base;
        }
        c=1/c;
        return c;
    }
}
13、调整数组顺序使奇数位于偶数前面

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

思路:将奇数和偶数项分别存在两个数组中,然后连接两个数组。

function reOrderArray(array)
{
    var head=[],tail=[];
    for(var i=0,n=array.length;i<n;i++){
        if(array[i]%2===0){
            tail.push(array[i]);
        }
        else{
            head.push(array[i]);
        }
    }
    head=head.concat(tail);
    return head;
}
14、链表中倒数第K个节点

题目描述:输入一个链表,输出该链表中倒数第k个结点。

思路:将链表节点从头到尾放入数组中,输出数组的第n-k项。

function FindKthToTail(head, k)
{
    var arr=[];
    while(head!==null){
        arr.push(head);
        head=head.next;
    }
    var n=arr.length;
    return arr[n-k];
}
15、反转链表

题目描述:输入一个链表,反转链表后,输出链表的所有元素。

思路:利用数组的unshift方法将链表各节点逆序存入数组中,用 arr[i].next.next=arr[i] 即可反转链表。

function ReverseList(pHead)
{
    if(pHead===null){
        return null;
    }
    var arr=[];
    while(pHead!==null){
        arr.unshift(pHead);
        pHead=pHead.next;
    }
    for(var i=1,n=arr.length;i<n;i++){
        arr[i].next.next=arr[i];   //1->2->3->4->5   4.next=5  5.next=4即可反转
    }
    arr[n-1].next=null
    return arr[0];
}
16、合并两个排序链表

题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

/*function ListNode(x){
 this.val = x;
 this.next = null;
 }*/
function Merge(pHead1, pHead2)
{
    var hh,h;
    if(pHead1===null&&pHead2===null){
        return null;
    }else if(pHead1===null){
        return pHead2;
    }else if(pHead2===null){
        return pHead1;
    }else{
        if(pHead1.val>=pHead2.val){
            h=pHead2;
            pHead2=pHead2.next;
            hh=h;
        }
        else{
            h=pHead1;
            pHead1=pHead1.next;
            hh=h;
        }
    }


    while(pHead2!==null||pHead1!==null){
        if(pHead2===null){
            while(pHead1!==null) {
                h.next = pHead1;
                pHead1 = pHead1.next;
                h=h.next;
            }
            break;
        }
        else if(pHead1===null){
            while(pHead2!==null) {
                h.next = pHead2;
                pHead2 = pHead2.next;
                h=h.next;
            }
            break;
        }
        if(pHead1.val>=pHead2.val){
            h.next=pHead2;
            pHead2=pHead2.next;
            h=h.next;
        }
        else{
            h.next=pHead1;
            pHead1=pHead1.next;
            h=h.next;
        }
    }
    return hh;
}
17、树的子结构

题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路:用递归法,先判断B是不是A的子结构,再判断B是不是A的左子树的子结构,最后判断B是不是A的右子树的子结构。

isSubtree函数中第一个参数为null说明A已经到叶子结点,故返回false,若第二个参数为null说明B已经到叶子结点,所有节点均能在A中找到,故返回true。

/* function TreeNode(x) {
 this.val = x;
 this.left = null;
 this.right = null;
 } */
function HasSubtree(pRoot1, pRoot2)
{
    if(pRoot1===null||pRoot2===null){
        return false;
    }else{
        return isSubtree(pRoot1,pRoot2)||HasSubtree(pRoot1.left,pRoot2)||HasSubtree(pRoot1.right,pRoot2);
    }
}
function isSubtree(r1,r2){
    if(r2===null){
        return true;
    }
    if(r1===null){
        return false;
    }
    if(r1.val===r2.val){
        return isSubtree(r1.left,r2.left)&&isSubtree(r1.right,r2.right);
    }else{
        return false;
    }
}
18、二叉树的镜像

题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。

思路:从根节点开始自顶向下交换每个节点的左右子树

/* function TreeNode(x) {
 this.val = x;
 this.left = null;
 this.right = null;
 } */
function Mirror(root)
{
    if(root===null){
        return null;
    }
    [root.left,root.right]=[root.right,root.left];
    Mirror(root.left);
    Mirror(root.right);
    return root;
}
19、顺时针打印矩阵

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

思路:用二维数组模拟矩阵,每次循环打印一圈,循环到行和列的中点时结束。

function printMatrix(matrix)
{
    if (matrix == null || matrix.length == 0) {
        return;
    }
    var rows = matrix.length;
    var cols = matrix[0].length;
    var start = 0;
    var result = [];

    while (cols > start * 2 && rows > start * 2) {
        var endX = cols - 1 - start;
        var endY = rows - 1 - start;
        //从左到右打印一行
        for (var i = start; i <= endX; i++) {
            result.push(matrix[start][i]);
        }
        //从上到下打印一行
        if (start < endY) {
            for (var i = start + 1; i <= endY; i++) {
                result.push(matrix[i][endX]);
            }
        }
        //从右到左打印一行
        if (start < endX && start < endY) {
            for (var i = endX - 1; i >= start; i--) {
                result.push(matrix[endY][i]);
            }
        }
        //从下到上打印一行
        if (start < endX && start < endY - 1) {
            for (var i = endY - 1; i >= start + 1; i--) {
                result.push(matrix[i][start]);
            }
        }
        start++;
    }
    return result;
}
20、包含min函数的栈

题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

思路:用数组模拟栈,Math.min.apply(null,array)得带最小值。

var stack=[];
function push(node)
{
    // write code here
    stack.push(node);
}
function pop()
{
    // write code here
    return stack.pop();
}
function top()
{
    // write code here
    return stack[stack.length-1]
}
function min()
{
    // write code here
    return Math.min.apply(this,stack);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值