文章目录
1、二维数组中的查找
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路
因为矩阵的特殊性,先从第一列最后一行开始比较,小于则向上查找,大于则向后查找
代码
function Find(target, array)
{
var row = array.length-1;
//row是行数 j是列数
for(var i=row,j=0; i>=0 && j<array[i].length;){
if(target == array[i][j]){
return true;
}else if(target > array[i][j]){
j++;
continue;
}else if(target < array[i][j]){
i--;
continue;
}
}
return false;
}
2、替换空格
题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路
使用正则表达式,\s+代表多个空格,?则表示取尽可能少的空格,然后通过replace函数替换为%20
代码
function replaceSpace(str)
{
// write code here
return str.replace(/\s+?/g,'%20')
}
//或者用空格来分离字符串,再填入需要的
function replaceSpace(str)
{
var array = str.split(' ');
var newStr = array.join('%20');
return newStr;
}
3、从尾到头打印链表
题目描述
输入一个链表,从尾到头打印链表每个节点的值。
思路
先将链表每个结点的值存入数组中,然后通过数组的reverse方法,即可从尾到头打印
代码
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function printListFromTailToHead(head)
{
// write code here
var arr=[];
while(head!=null){
arr.push(head.val);
head=head.next;
}
return arr.reverse()
}
//另一种写法
//unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度,unshift() 方法不创建新的创建,而是直接修改原有的数组
function printListFromTailToHead(head)
{
var array = [];
while(head){
//放到数组的开头 循环下去第一个就是尾巴
array.unshift(head.val);
head = head.next;
}
return array;
}
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;
//前序遍历先遍历根节点,所以先找到中序遍历中根节点的位置
//indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
var index=vin.indexOf(pre[0]);
//slice(start,end)返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
var left=vin.slice(0,index);//中序左子树
var right=vin.slice(index+1);//中序右子树
return {
val:pre[0],//根节点
//递归左右子树的前序,中序
left:reConstructBinaryTree(pre.slice(1,index+1),left),
right:reConstructBinaryTree(pre.slice(index+1),right)
};
}
5、用两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。
思路
队列是先进先出的结构,栈是先进后出的结构,所以可以直接使用JavaScript的数组类型来实现。
代码
var result=[];
function push(node)
{
// write code here
result.push(node)
}
function pop()
{
// write code here
return result.shift()
}
6、旋转数组的最小数字——二分查找的变形——搞不懂
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路一
直接将数组按从小到大排序,返回第一个元素即可。
代码
function minNumberInRotateArray(rotateArray)
{
// write code here
rotateArray.sort(function(a,b){
if(a<b) return -1;
else return 1;
});
return rotateArray[0];
}
思路二
采用二分法解答这个问题,三种情况
- 数组为空
- 部分旋转,例如由(1,2,3,4,5)旋转为(3,4,5,1,2),此时只需要遍历数组,找到当前数比前面的数小的数即可。
- 完全旋转,例如由(1,2,3,4,5)旋转为(1,2,3,4,5),此时第一个数最小
代码
function minNumberInRotateArray(rotateArray)
{
//数组为空返回0
if(rotateArray.length===0){
return 0;
}
//数组长度为1返回第一个
if(rotateArray.length===1){
return rotateArray[0];
}
//parseInt(string, radix)可解析一个字符串,并返回一个整数。
/* string 必需。要被解析的字符串。
radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。 */
var index=parseInt(Math.floor((rotateArray.length)/2)); //二分
var left=rotateArray.slice(0,index); //左
var right=rotateArray.slice(index); //右
var recuArray;//rotateArray[index-]>=rotateArray[0]?right:left;//判断左右
if(rotateArray[index-1]<rotateArray[0]){
recuArray=left;
}else {
//是否还是旋转数组
if(right[0]<=right[right.length-1]) return right[0];
else recuArray=right;
}
return minNumberInRotateArray(recuArray); //递归
}