前端面试算法集合

问题1:给定一个数组a和一个长度值l,生成一个指定长度值为l的新数组b,要求b中的每一个元素都是从a中随机获取的,且数组元素不可重复。

function generate(a,l){
if(a.length < l) return '老数组长度不足!';
/*a长度可能超出,可以生成新数组后截取长度为l的赋值给b,也可以生成为l的b(这里选第二种)*/
var i=0, tmp=[], b=[];
// 每次获取a的一个随机元素,同时将
while(i<l && tmp.length<=a.length) {
var random = Math.floor(Math.random()*(a.length));
if(tmp.indexOf(random) == -1) { // 判断随机元素是否已经使用过,未使用则放入临时数组记录
tmp.push(random);
var number = a[random]; // 获取数组a中的随机数
console.log(random+"..."+number);
if(b.indexOf(number) == -1) { //部分IE不支持indexOf请自行解决。也可以使用jquery的$.inArray方法,总之就是不重复扔进b
b.push(number);
i++; // 新随机数时+1
}
}
}
if(b.length==l) return b;
else return '新数组长度不足: '+ b;
}

// 测试
var a=[3,2,1,6,3,9,2,5];
generate(a, 5)

问题2:使用js写一个栈结构。然后如何让这个栈满足两个调用者同时使用的要求?

function Stack() {
  this.dataStore = [];
  this.top = 0;//栈顶元素的位置
  this.push = push;
  this.pop = pop;
  this.peek = peek;
  this.length=length;
  this.clear=clear;
}

function push(element) {//进栈
   this.dataStore[this.top++] = element;
}

function pop() {//出栈
  return this.dataStore[--this.top];
}

function peek() {//栈顶元素
  return this.dataStore[this.top-1];
}

function length() {
  return this.top;
}

function clear() {
  this.top = 0;
}

//测试栈的实现
var s= new Stack();
s.push("D");
s.push("R");
s.push("B");
console.log(s.length());
console.log(s.peek());
console.log(s.clear());
console.log(s.length());

问题3:找出数组中只出现一次的元素

 function num(arr){
        var str=arr.join(''); 
        var res=[];
        for(var i=0;i<str.length;i++){           
            var num=str.split(str[i]).length-1;
            if(num===1){
                res.push(str[i]);
            }
        }

        return res;

     }
     var arr=[1,2,1,4,3,3];
     console.log(num(arr));

问题4:现在对于给定的一个字符串s,请计算出字典序最大的s的子序列。

function max(str){
        //字典序从小到大:abcdefg......
        var arr=str.split('');
        var res=[arr[arr.length-1]];//字符串最后一个元素肯定符合条件
        for(var i=arr.length-2;i>=0;i--){//从倒数第二个元素开始,找单调递增的元素
            if(arr[i]>=res[0]){
                res.unshift(arr[i]);//找到符合的直接加入到res中
            }
        }
        return  res.join('');

     }

     var str='abddaa';
     console.log(max(str));

问题5:判断树是否为对称树

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
 
function isSymmetrical2(root1, root2){
    if(root1 == null && root2 == null){
        return true;
    }
    if(root1 == null || root2 == null){
        return false;
    }
    if(root1.val != root2.val){
        return false;
    }
    return isSymmetrical2(root1.left, root2.right) && isSymmetrical2(root1.right, root2.left);
}
 
function isSymmetrical(pRoot)
{
    // write code here
    return isSymmetrical2(pRoot, pRoot)
}

问题6:把一棵二叉树变成它的镜像二叉树

function Mirror(root){
            if(root==null){//当一开始根节是空的时候,返回false
                return false;
            }
            if(root.left ==null && root.right ==null){//当只有一个根节点时返回false
                return false;

            }
            //第三种情况:当左右子树不为空的时候,交互左右子树节点
            var temp=root.left;
            root.left=root.right;
            root.right=temp;
            if(root.left!=null){//递归遍历左子树
                Mirror(root.left);
            }
            if(root.right!=null){//递归遍历右子树
                Mirror(root.right);
            }
        }

问题7:顺时针打印矩阵

function printMatrix(matrix)
{
    // write code here
        var row1 = 0;
        var row2 = matrix.length-1;
        var col1 = 0;
        var col2 = matrix[0].length-1;
        var rowflag = 1;
        var colflag = 1;
       var list=[];
        while(row2>=row1 && col2>=col1){
            if(rowflag == 1){
                for(var i=col1; i<=col2; i++)
                    list.push(matrix[row1][i]);
                row1++;
            }
            if(colflag == 1){
                for(var i=row1; i<=row2; i++)
                    list.push(matrix[i][col2]);
                col2--;
            }
            if(rowflag == -1){
                for(var i=col2; i>=col1; i--)
                    list.push(matrix[row2][i]);
                row2--;
            }
            if(colflag == -1){
                for(var i=row2; i>=row1; i--)
                    list.push(matrix[i][col1]);
                col1++;
            }
            rowflag = rowflag*(-1);
            colflag = colflag*(-1);
        }
        
        return list;
 
}

问题8:Fibinacc数列

function Fibnacci(n){
            var res=[0,1];
            if(n<2){
                return res[n];
            }
            var fib1=0;
            var fib2=1;
            var fibn=0;
            for(var i=2;i<=n;i++){
                fibn=fib1+fib2;
                fib1=fib2;
                fib2=fibn;
            }
            return fibn;

        }
function jumpFloor(number)
{
    if(number ===0){
        return 0;
    }
    if(number===1){
        return 1;
}
    if(number ===2){
        return 2;
    }
    var one = 1;
    var two = 2;
    var num = 0;
    for(let i=3;i<=number;i++){
        num = one + two;
        one = two;
        two = num;
         
    }
    return num
}

问题9:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

function Find(target, array) {
  let i = 0;
  let j = array[i].length - 1;
  while (i < array.length && j >= 0) {
    if (array[i][j] < target) {
      i++;
    } else if (array[i][j] > target) {
      j--;
    } else {
      return true;
    }
  }
  return false;
}

问题10:数组中出现次数超过一半的元素

function MoreThanHalfNum_Solution(numbers)
{
    // write code here
    if(numbers==null){
        return null;
    }    
        var string=numbers.join('');
        var len=Math.floor(numbers.length/2);
        for(var i=0;i<numbers.length;i++){
           var num=string.split(numbers[i]).length-1;
           if(num>len){
              return numbers[i];
               break;
           }
        }    
        return 0;
}

问题10:字符串全排列

function Permutation(str)
{
    if(str === null || str === "")
        return [];
    var res = [];
    var index = 0;
     
    step(str.split(""), index, res);
     
    return res.sort();
}
 
function step(strArr, cur, res) {
    if(cur === strArr.length-1){
        var i = 0, str = "";
        while(i < strArr.length){
            str += strArr[i++];
        }
        res.push(str);
    }
     
    for(var i = cur;i < strArr.length;i++) {
        if(strArr[i] === strArr[cur] && i !== cur)
            continue;
        swap(strArr, i, cur);
        step(strArr, cur+1, res);
        swap(strArr, i, cur);
    }
}
 
function swap(arr, a, b) {
    var temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

猜你喜欢

转载自blog.csdn.net/L_SS133/article/details/81706013