剑指offer(javascript实现)

时间:2023-03-09 13:15:31
剑指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.二叉树的下一个结点

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。