剑指offer(javascript实现)
1.二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
function Find(target, array)
{
    var row = array.length;  // 行数
    var col = array[0].length;  // 列数
    // 从左下角开始比较
    var r = row - 1;
    var c = 0;
    while(r >= 0 && c <= col - 1) { // 注意这里有等于号
        if (target > array[r][c]) {
            c++;
        }
        else if (target < array[r][c]) {
            r--;
        }
        else {
            return true;
        }
    }
    return false;
}
2.替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
function replaceSpace(str)
{
    // write code here
    return str.replace(/\s/g,'%20');
}
3.从尾到头打印链表
/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function printListFromTailToHead(head)
{
    var res=[];
    while(head){
        res.unshift(head.val);  // unshift():向数组的开头添加一个或更多元素,并返回新的长度
        head=head.next;
    }
    return res;
}
4.重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}
function reConstructBinaryTree(pre, vin)
{
    // write code here
    if(pre.length == 0 || vin.length == 0 ) {
        return null;
    }
    var treeNode = new TreeNode(pre[0]);
    for(var i = 0; i < pre.length; i++) {
        if (vin[i] === pre[0]) {
            treeNode.left = reConstructBinaryTree(pre.slice(1, i+1), vin.slice(0, i));
            treeNode.right = reConstructBinaryTree(pre.slice(i+1),vin.slice(i+1));
        }
    }
    return treeNode;
}
module.exports = {
    reConstructBinaryTree : reConstructBinaryTree
};
5.用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型
function Stack(){
    var arr = [];
    this.push = function (node){
        arr.push(node);
        return arr;
    };
    this.pop = function(){
        return arr.pop();
    };
    this.isEmpty = function(){
        return arr.length === 0;
    };
}
var stack1 = new Stack();
var stack2 = new Stack();
function push(node)
{
    // write code here
    stack1.push(node);
}
function pop()
{
    // write code here
    if(stack1.isEmpty() && stack2.isEmpty()){
        throw new Error("empty queue");
    }
    if(stack2.isEmpty()){
        while(!stack1.isEmpty()){
            stack2.push(stack1.pop());
        }
    }
    return stack2.pop();
}
6.旋转数组的最小数字
function minNumberInarr(arr) {
    // write code here
    var left = 0;
    var right = arr.length-1;
    var mid = left;
    if (arr.length == 0) return;
    while(arr[left] >= arr[right]){
        if(right-left == 1){
            mid = right;
            break;
        }
        mid = Math.floor((left+right)/2)
        if(arr[mid] >= arr[left]){
            left = mid;
        }
        else if(arr[mid] < arr[left]){
            right = mid;
        }
        else if(arr[mid] == arr[right] && arr[mid] == arr[left]){
            return inOrder(arr);
        }
    }
    return arr[mid];
}
function inOrder(arr){
    var min = arr[0];
    for(var i = 0; i<arr.length; i++){
        if(min > arr[i]){
            min = arr[i];
        }
    }
    return min;
}
7.斐波那契数列
输入一个整数n,请你输出斐波那契数列的第n项。
// 递归版本:
    function f(n) {
        if (n == 0 || n == 1) {
            return n;
        }
        else {
            return f(n-1) + f(n-2);
        }
    }
// 动态规划版本:
function f(n)
{
    // write code here
    if (n == 0 || n == 1) {
        return n;
    }
    var f1 = 0;
    var f2 = 1;
    var temp;
    for (var i = 2; i <= n; i++) {
        temp = f1 + f2;
        f1 = f2;
        f2 = temp;
    }
    return f2;
}
8.跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
function jumpFloor(n) {
    //0,1,2,3,5,8....
    if (n < 0) {
        return;
    }
    if (n >=0 && n <= 2) {
        return n;
    }
    var f1 = 1;
    var f2 = 2;
    var temp = 0;
    for (var i = 0; i < n - 2; i++) {
        temp = f1;
        f1 = f2;
        f2 = temp + f1;
    }
    return f2;
}
9.变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
// 0 1 2 4 8 16 32 64...
function jumpFloorII(number)
{
	if (number < 0) return;
    if (number >= 0 && number <= 2) return number;
    return 2 * jumpFloorII(number - 1)
}
10.矩形覆盖(不能AC)
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
// 0,1,2,3,5,8,13,21...
function rectCover(number)
{
    // write code here
    if (number < 1) {
        return 0;
    }
    else if (number == 1 || number == 2) {
        return number;
    }
    else {
        return rectCover(number - 1) + rectCover(number - 2);
    }
}
11.二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
function NumberOf1(n)
{
    var count = 0;
    while(n) {
        ++count;
        n = (n - 1) & n;
    }
    return count;
}
12.数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
function Power(base, exponent)
{
    // write code here
    return Math.pow(base, exponent);
}
13.调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
function reOrderArray(array)
{
    // write code here
    var len = array.length;
    var arr1 = [];  // 存放奇数
    var arr2 = [];  // 存放偶数
    for (var i = 0; i < len; i++) {
        if (array[i] % 2 != 0) {
            arr1.push(array[i])
        }
        else {
            arr2.push(array[i]);
        }
    }
    return arr1.concat(arr2);
}
14. 链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
function FindKthToTail(head, k)
{
    // write code here
    if(head == null || k <= 0) return false;;
    var p1 = head;
    var p2 = head;
    for (var i = 1; i < k; i++) {
        if (p1.next != null) {
            p1 = p1.next;
        }
        else {
            return false;
        }
    }
    while (p1.next != null) {
        p1 = p1.next;
        p2 = p2.next;
    }
    return p2;
}
15.反转链表
输入一个链表,反转链表后,输出链表的所有元素。
function ReverseList(pHead)
{
    // write code here
    if (!pHead) return false;
    var p1 = null,
        p2 = null,
    	temp = null;
    p1 = pHead;
    while (p1) {
        temp = p1.next;
        p1.next = p2;
        p2 = p1;
        p1 = temp;
    }
    return p2;
}
16.合并两个排序链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function Merge(pHead1, pHead2)
{
    // write code here
    if (pHead1 == null || pHead2 == null) {
        return pHead1 || pHead2;
    }
    var head = null;  // 新链表
    if (pHead1.val < pHead2.val) {  // 将表头小的作为头结点
        head = pHead1;  // 不是head = pHead1.val
        head.next = Merge(pHead1.next, pHead2);
    }
    else {
        head = pHead2; // 不是head = pHead2.val
        head.next = Merge(pHead1, pHead2.next);
    }
    return head;
}
17.树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function isSubtree(root1, root2) {
    if (root2 == null) return true;
    if (root1 == null) return false;
    if (root1.val == root2.val) {
        return isSubtree(root1.left, root2.left)
            && isSubtree(root1.right, root2.right);
    } else {
        return false;
    }
}
function HasSubtree(pRoot1, pRoot2)
{
   if (pRoot1 == null || pRoot2 == null) {
       return false;
   }
    return isSubtree(pRoot1, pRoot2)
        || HasSubtree(pRoot1.left, pRoot2)
        || HasSubtree(pRoot1.right, pRoot2);
}
18.二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。
二叉树的镜像定义:
源二叉树 :
8
/  
6   10
/ \  / 
5  7 9 11
镜像二叉树:
8
/  
10   6
/ \  / 
11 9 7  5
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Mirror(root)
{
    // write code here
    if (root == null) {
        return;
    }
    var temp = root.left;
    root.left = root.right;
    root.right = temp;
    if (root.left) Mirror(root.left);
    if (root.right) Mirror(root.right);
}
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)
{
    // write code here
    var row = matrix.length;
    var col = matrix[0].length;
    var res = [];
    if (row == 0 || col == 0) {
        return res;
    }
    var left = 0,
        top = 0,
        right = col -1,
        bottom = row - 1;
    while (left <= right && top <= bottom)
    {
        // 左->右
        for (var i = left; i <= right; i++)  res.push(matrix[top][i]);
        // 上->下
        for (var i = top + 1; i <= bottom; i++)  res.push(matrix[i][right]);
        // 右->左
        if (top != bottom)
        for (var i = right - 1; i >= left; i--)  res.push(matrix[bottom][i]);
        // 下->上
        if (left != right)
        for (var i = bottom - 1; i > top; i--)  res.push(matrix[i][left]);
        left++,top++,right--,bottom--;
    }
    return res;
}
20.包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
var arr = [];
function push(node)
{
    // write code here
    arr.push(node);
}
function pop()
{
    // write code here
    return arr.pop();
}
function top()
{
    // write code here
    return arr[arr.length - 1];
}
function min()
{
    return Math.min.apply(Math, arr);
}
21.栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
function IsPopOrder(pushV, popV)
{
    // write code here
    var stack = [];
    for(var i = 0,j = 0; i < pushV.length; i++){
        stack.push(pushV[i]);
        while(j < popV.length && stack[stack.length - 1] == popV[j]){
            j++;
            stack.pop();
        }
    }
    if (stack.length == 0){
        return true;
    }
    else {
        return false;
    }
}
22.从上往下打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
// 剑指Offer思路
function PrintFromTopToBottom(root)
{
    // write code here
    var arr = [];
    var data = [];
    if(root != null){
        arr.push(root);  // 先放入祖先结点
    }
    while(arr.length != 0){
        var node = arr.shift();  // 弹出arr中的第一个元素的结构
        if(node.left != null){
            arr.push(node.left);
        }
        if(node.right != null){
            arr.push(node.right);
        }
        data.push(node.val);
    }
    return data;
}
23.二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
function VerifySquenceOfBST(sequence)
{
    // write code here
    var n = sequence.length;
    var i = 0;
    if (n == 0) {
        return false;
    }
    while (n--) {
        while (sequence[i] < sequence[n])
            i++;
        while (sequence[i] > sequence[n])
            i++;
        if (i < n) return false;
        i = 0;
    }
    return true;
}
24.二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
25.复杂链表的赋值
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
function RandomListNode(x){
    this.label = x;
    this.next = null;
    this.random = null;
}
function Clone(pHead)
{
    // write code here
    if(pHead == null) return null;
    var node = new RandomListNode(pHead.label);
    node.random = pHead.random;
    node.next = Clone(pHead.next);
    return node;
}
26.二叉搜索树与双向链表
27.字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
function Permutation(str)
{
    // write code here
    var result = [];
    if(str.length <= 0){
        return [];
    }
    var str2 = "";
    var arr = str.split("");
    result = sortString(arr,str2,[]);
    return result;
}
function sortString(arr,str2,res){
    if(arr.length == 0){
        res.push(str2);
    }else{
        var isUsed = {};
        for(var i = 0; i < arr.length; i++){
            if(!isUsed[arr[i]]){
                var temp = arr.splice(i,1)[0];//删除相应位置和数量的元素
                str2 += temp;
                sortString(arr,str2,res);
                arr.splice(i,0,temp); //把刚才删除的元素补全,接着遍历字符数组的下一位
                str2 = str2.slice(0,str2.length-1);
                isUsed[temp] = true;
            }
        }
    }
    return res;
}
28.数组中出现次数超过一般的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
function MoreThanHalfNum_Solution(numbers) {
    var len = numbers.length;
    if (len == 0) return 0;
    var num = numbers[0],
        count = 1;
    for (var i = 1; i < len; i++) {
        if (numbers[i] == num) {
            count++;
        }
        else {
            count--;
        }
        if (count == 0) {
            num = numbers[i];
            count = 1;
        }
    }
    // Verifying
    count = 0;
    for (var i = 0; i < len; i++) {
        if (numbers[i] == num) count++;
    }
    if (count * 2 > len) return num;
    return 0;
}
29.最小的k个数字
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
function GetLeastNumbers_Solution(input, k)
{
    // write code here
    if (k > input.length) {
        return [];
    }
    input.sort(cmp);
    var res = [];
    return(input.slice(0,k));
}
function cmp(a,b) {
    return a - b;
}
30.连续子数组的最大和
输入一个整型数组,数组里有正数和负数。数组中一个或连续的多个整数,组成一个子数组。求所有子数组的最大值。要求时间复杂度为O(n)。
例如,输入的数组为[1,-2,3,10,-4,7,2,-5];
function FindGreatestSumOfSubArray(array)
{
  if (array.length === 0) return 0;
  var max = array[0];
  var temp = array[0];
  for (var i = 1; i < array.length; i++) {
      temp = temp > 0 ? temp + array[i] : array[i];
      max = max > temp ? max : temp;
  }
  return max;
}
31.数组中1出现的次数
输入一个整数n,求从1到n这个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12。1一共出现了5次。
32.把数组排成最小的数
输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323
function PrintMinNumber(numbers)
{
    var result = numbers.sort(function(a,b){
        return Number([a,b].join('')) - Number([b,a].join(''));
    })
    return result.join('');
}
33.丑数
我们把只包含因子2,3,5的数称作丑数。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第一个丑数
function GetUglyNumber_Solution(index){
    if (index < 7) return index;
    var res = [];
    res[0] = 1;
    var t2 = 0, t3 = 0, t5 = 0;
    for (var i = 1; i < index; ++i) {
        res[i] = Math.min(res[t2] * 2, Math.min(res[t3] * 3, res[t5] * 5));
        if (res[i] === res[t2] * 2) t2++;
        if (res[i] === res[t3] * 3) t3++;
        if (res[i] === res[t5] * 5) t5++;
    }
    return res[index - 1];
}
34.第一个只出现一次的字符
在字符串中找出第一个只出现一次的字符。如输入"abaccdeff"则输出b
35.数组中的逆序
在数组中的两个数字如果前面一个数字大于后面的数字,在这两个数字组成一个逆序对。输入一个数组,求出这个数组中逆序对的总数。
例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)、(5,4)
36.两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。
37.数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。
function GetNumberOfK(data, k)
{
    // write code here
    var len = data.length;
    if (data.indexOf(k) === -1 || len === 0) {
        return 0;
    }
    var index1 = data.indexOf(k);
    var index2 = data.lastIndexOf(k);
    // 比如只出现一次的数字,如果相减则为0,而且出现多次的数字,如果不相减,也会少一个
    return (index2 - index1 + 1);
}
38.二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function TreeDepth(pRoot)
{
    // write code here
    if (pRoot == null) {
        return 0;
    }
    var nLeft = TreeDepth(pRoot.left);
    var nRight = TreeDepth(pRoot.right);
    return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}
39.平衡二叉树
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function IsBalanced_Solution(pRoot)
{
    // write code here
    if(pRoot == null)
        return true;
    var left = TreeDepth(pRoot.left);
    var right = TreeDepth(pRoot.right);
    var diff = left - right;
    if(diff > 1 || diff < -1)
        return false;
    return IsBalanced_Solution(pRoot.left)
        && IsBalanced_Solution(pRoot.right);
}
function TreeDepth(pRoot)
{
    // write code here
    if (pRoot == null) {
        return 0;
    }
    var nLeft = TreeDepth(pRoot.left);
    var nRight = TreeDepth(pRoot.right);
    return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}
40.数组中只出现一次的数
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
Array.prototype.uniq = function () {
    var res = [];
    var json = {};
    for (var i = 0; i < this.length; i++) {
        if (!json[this[i]]) {
            res.push(this[i]);
            json[this[i]] = 1;
        }
    }
    return res;
}
function FindNumsAppearOnce(array)
{
    // write code here
    // return list, 比如[a,b],其中ab是出现一次的两个数字
    var a = array;
    var b = a.uniq();
    var arr = [];
    var k = 0;
    for (var i = 0; i < b.length; i++) {
        for (var j = 0; j < a.length; j++) {
            if (a[j] == b[i]) {
                k++;
            }
        }
        if (k === 1) {
            arr.push(b[i]);
        }
        k = 0; // 重新赋值0,继续下一次循环
    }
    return arr;
}
41.和为S的连续整数序列
42.和为S的两个数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
43.左旋转字符串
如:S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”
function LeftRotateString(str, n)
{
    // write code here
    if (str == null) {
        return "";
    }
    var s1 = str.slice(0,n);
    var s2 = str.slice(n);
    var b1 = s1.split("");
    var b2 = s2.split("");
    var b3 = b2.concat(b1);
    return b3.join('');
}
44.翻转单词顺序列
例如,“student. a am I”。正确的句子应该是“I am a student.”
function ReverseSentence(str)
{
    // write code here
    return str.split(" ").reverse().join(" ");
}
45.扑克牌顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
function IsContinuous(numbers)
{
    var len = numbers.length;
    if (len < 1) {
        return false;
    }
    // 排序
    var n = numbers.sort();
    var count = 0;
    var index = 0;
    // 统计出0的个数
    while(n[index] == 0) {
        ++count;
        ++index;
    }
    // 计算数据之间的间隔
    var small = index;
    var big = index + 1;
    var diff = 0;
    while (big < len) {
        if (n[small] == n[big]) {  // 有对子出现
            return false;
        }
        // 计算间隔
        diff += (n[big] - n[small] - 1);
        small = big;
        ++big;
    }
    if (diff == count || diff == 0) {
        return true;
    }
    return false;
}
46.圆圈中最后剩下的数
function LastRemaining_Solution(n, m)
{
    // write code here
    if(n==0)
        return -1;
    if(n==1)
        return 0;
    else
        return (LastRemaining_Solution(n-1,m)+m)%n;
}
47.求1+2+3+...+n
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
function Sum_Solution(n)
{
    // write code here
    var ans = n;
    ans && (ans += Sum_Solution(n - 1));
    return ans;
}
48.不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
function Add(num1, num2)
{
    // write code here
    while(num2!=0){
        var temp=num1^num2;
        num2=(num1&num2)<<1;
        num1=temp;
    }
    return num1;
}
49.把字符串转换成整数
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
function StrToInt(str)
{
    // write code here
    var str = Number(str);
    if(!str)
        return 0;
    else
        return str;
}
50.数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
function duplicate(numbers, duplication)
{
    // write code here
    //这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
    //函数返回True/False
    if(numbers == null) return false;
    if(numbers.length == 1) return false;
    numbers.sort();
    for(var i = 0; i < numbers.length - 1; i++){
        if(numbers[i] == numbers[i+1])
            {
                duplication[0] = numbers[i];
                return true;
            }
    }
    return false;
}
51.构建乘积数组
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1]。不能使用除法。
52.正则表达式匹配
请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
//s, pattern都是字符串
function match(s, pattern)
{
    // write code here
    var pattern = '^'+pattern +'$';
    var pat = new RegExp(pattern,'g');
    return pat.test(s);
}
53.表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
//s字符串
function isNumeric(s)
{
    // write code here
    return !isNaN(s)
}
54.字符流中第一个不重复的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
55.链表中环的入口结点
一个链表中包含环,请找出该链表的环的入口结点。
/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function EntryNodeOfLoop(pHead)
{
    // write code here
    if(pHead == null){
        return;
    }
    var current = pHead;
    while(current.next!=null){
        current.flag = true;
        if(current.next.flag==true){
            return current.next;
        }
        current = current.next;
    }
    return null;
}
56.删除链表中的重复结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
57.二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
剑指offer(javascript实现)的更多相关文章
- 剑指Offer——知识点储备-J2EE基础
		剑指Offer--知识点储备-J2EE基础 9.2 jdk 1.8的新特性(核心是Lambda 表达式) 参考链接:http://www.bubuko.com/infodetail-690646.ht ... 
- JS版剑指offer
		介绍 用JavaScript刷完了剑指offer,故总结下每道题的难度.解决关键点,详细题解代码可以点链接进去细看. 关于JS刷题的技巧可以看我之前的这篇:JS刷题总结. 剑指offer的题目在牛客网 ... 
- 关于数据结构,剑指offer上面的
		我很喜欢那些javascript解决的编程题,感觉非常的有意思.我在博客园上面看到了一个同学的博客,他一共发了34篇剑指offer的编程题,还给出了非常详细的解答. 接下来的工作,我做的就是搬运工,不 ... 
- JS数据结构与算法 - 剑指offer二叉树算法题汇总
		❗❗ 必看经验 在博主刷题期间,基本上是碰到一道二叉树就不会碰到一道就不会,有时候一个下午都在搞一道题,看别人解题思路就算能看懂,自己写就呵呵了.一气之下不刷了,改而先去把二叉树的基础算法给搞搞懂,然 ... 
- 《剑指Offer》- 连续子数组的最大和或最小和
		前言 本文是<剑指Offer>系列(JavaScript版)的第一篇,题目是"连续子数组的最大和或最小和". 话不多说,开始"打怪"修炼... 一. ... 
- 【剑指offer】00 开撸剑指offer
		此篇为刷题链接集合,我会将剑指offer中的每一题单独做一篇随笔,然后将链接加在本篇随笔中. //将用JavaScript解题 剑指offer:https://www.nowcoder.com/ta/ ... 
- 剑指Offer面试题:1.实现Singleton模式
		说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ... 
- 剑指Offer面试题:14.链表的倒数第k个节点
		PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ... 
- 《剑指offer》面试题12:打印1到最大的n位数
		面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ... 
随机推荐
- Android全局异常处理 实现自己定义做强制退出和carsh日志抓取
			在做android项目开发时,大家都知道都会遇到程序报错或者Anr异常,会弹出来一个强制退出的弹出框,对于开发人员是好事,但是对于用户体验和 UI实在毫无违和感,别说用户接受不了,就连我们自己本身可能 ... 
- 苹果新的编程语言 Swift 语言进阶(八)--属性
			属性是特定类.结构或枚举的相关值,属性根据作用域不同分为实例属性与类型属性,还可以根据是否存储分为存储属性和计算属性. 1.1 实例属性 为一个类.结构或枚举定义的属性默认属于实例属性,即该属性属于为 ... 
- Objective-C的面向对象特性(一)
			Objective-C在c语言的基础上增加了面向对象特性,都有哪些面向对象特性呢? 其中第一个最重要的特性是类和对象的实现. Objective-C软件由许多对象构成,形成一个对象网络,对象之间通过发 ... 
- Asp.NetCore+Microsoft.AspNetCore.SignalR前后端分离
			1.新建WebApi 2.安装Microsoft.AspNetCore.SignalR 3.新建一个集线器和消息类 using Microsoft.AspNetCore.SignalR; using ... 
- 实现Redhat Linux 6和Windows通过Windows Server AD统一认证并共享访问Oracle ZS存储系统
			Windows Server 2012 AD设置 1. 建立新的组织单位OU 为用户提前建立好OU,是为了AD用户管理简单清晰. 2. 建立新的用户和用户组 建立新的用户的时候,要同时将用户归属到 ... 
- java中Scanner类nextLine()和next()的区别和使用方法
			转载:http://blog.csdn.net/zhiyuan_ma/article/details/51592730 在实现字符窗口的输入时,很多人更喜欢选择使用扫描器Scanner,它操作起来比较 ... 
- 新一代大数据处理引擎 Apache Flink
			https://www.ibm.com/developerworks/cn/opensource/os-cn-apache-flink/index.html 大数据计算引擎的发展 这几年大数据的飞速发 ... 
- Android layout_margin 无效的解决办法
			http://www.aichengxu.com/view/31025 1.如果LinearLayout中使用Android:layout_marginRight不起作用,通过测试原来在android ... 
- Entity Framework分页扩展
			Entity Framework分页在我初入门时总是困扰这我,无论是SQL分页还是Entity Framework的分页,总是显得那么麻烦,因此对于Entity Framework单独封装了分页. 一 ... 
- JDBC连接数据库时候出错
			错误提示如下: Fri May 13 09:06:04 CST 2016 WARN: Establishing SSL connection without server's identity ver ... 
