记几个算法面试题

最近去面试,遇到很多算法类的题目,看的是一脸懵,故特此记录下了此份试题,慢慢去研究里面的问题。

1 一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。

例:n=1237

则输出为:1237,2474,4948,9896,9896,4948,2474,1237

ps.暂时没找到不用循环的js写法

function multiple(n){
  var mult = Math.floor(5000/n),
     arr = [],
       arr1 = [],
       num;
    for(var i=0;i<mult;i++){
         num = Math.pow(2,i)*n;
         arr.push(num);
  }
  var arr1 = arr.slice().reverse()
  //arr1 = [...arr].reverse();
  //var arr1 = [].concat(arr).reverse()
  //var arr1 = Object.assign([],arr).reverse()
  return arr.concat(arr1);
}

2 将一个键盘输入的数字转化成中文输出,例如,输入1234567 则输出一百二十三万四千五百六十七

var _change = {
           ary0:["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"],
           ary1:["", "十", "百", "千"],
           ary2:["", "万", "亿", "兆"],
           init:function (name) {
               this.name = name;
           },
           strrev:function () {
               var ary = []
               for (var i = this.name.length; i >= 0; i--) {
                   ary.push(this.name[i])
               }
               return ary.join("");
           }, //倒转字符串。
           pri_ary:function () {
               var $this = this;
               var ary = this.strrev();
               var zero = "";
               var newary = "";
               var i4 = -1;
               for (var i = 0; i < ary.length; i++) {
                   if (i % 4 == 0) { //首先判断万级单位,每隔四个字符就让万级单位数组索引号递增
                       i4++;
                       newary = this.ary2[i4] + newary; //将万级单位存入该字符的读法中去,它肯定是放在当前字符读法的末尾,所以首先将它叠加入$r中,
                       zero = ""; //在万级单位位置的“0”肯定是不用的读的,所以设置零的读法为空
                   }
                   //关于0的处理与判断。
                   if (ary[i] == '0') { //如果读出的字符是“0”,执行如下判断这个“0”是否读作“零”
                       switch (i % 4) {
                           case 0:
                           break;
                           //如果位置索引能被4整除,表示它所处位置是万级单位位置,这个位置的0的读法在前面就已经设置好了,所以这里直接跳过
                           case 1:
                           case 2:
                           case 3:
                           if (ary[i - 1] != '0') {
                               zero = "零";
                            } ; //如果不被4整除,那么都执行这段判断代码:如果它的下一位数字(针对当前字符串来说是上一个字符,因为之前执行了反转)也是0,那么跳过,否则读作“零”
                           break;
                       }
                       newary = zero + newary;
                       zero = '';
                   }
                   else { //如果不是“0”
                       newary = this.ary0[parseInt(ary[i])] + this.ary1[i % 4] + newary; //就将该当字符转换成数值型,并作为数组ary0的索引号,以得到与之对应的中文读法,其后再跟上它的的一级单位(空、十、百还是千)最后再加上前面已存入的读法内容。
                   }
               }
               if (newary.indexOf("零") == 0) {
                   newary = newary.substr(1);
               }//处理前面的0
               return newary;
           }
       }
       //创建class类
       function change() {
           this.init.apply(this, arguments);
       }
       change.prototype = _change;
      //创建实例
       var k = new change("00102040");
       alert(k.pri_ary());

3 至少写出一种排序算法

冒泡算法

function bubbleSort(arr){

  var len = arr.length;

  for(var i=0; i<len; i++){ //总共需要比较的轮数

    for(var j=0; j<len-1-i; j++){  //  每一轮需要进行比较的数字

      if( arr[j]<arr[j+1]){    // 相邻元素相比,小的移至到右边

       var temp = arr[j+1];

       arr[j+1] = arr[j];

       arr[j] = temp;

      }

    }

  }

      return arr;

}

4 盘算102-200之间有多少个素数,并输出所有素数

var i,j,m;
var k=0;
for (i=100;i<=200;i++){ 
  for(m=1,j=2;j< i;j++)
    if(i%j==0) {

      m=0;
      break;

    }

    if(m==1){
      k++;
      console.log (i);
      console.log (k);
    }
}

5 给定一个字符串,输出本字符串中只出现一次并且最靠前的那个的位置?

function unique(str){
  var arr = str.split(""),
     arr1=[],
     arr2=[],
     temp={},
     len = arr.length;
  for(var i=0;i<len;i++){
    if(!temp[arr[i]]){
      temp[arr[i]]= 'abc';
      arr1.push(arr[i]);
    }else{
      arr2.push(arr[i]);
    }
}
  var  len1 = arr1.length,
      len2 = arr2.length;
  for(var j=0;j<len1;j++){
    if(arr2.indexOf(arr1[j])<0){
      var chart = arr1[j];
      break;
    }
  }
  var index = arr.indexOf(chart);
  return index+1;
}

例如:ahhhdjnikkjhasc 则是d,输出5

6 写一个函数,找出一个整数数组中,第二大的数

function bubbleSort(arr){

  var len = arr.length;

  for(var i=0; i<len; i++){ //总共需要比较的轮数

    for(var j=0; j<len-1-i; j++){  //  每一轮需要进行比较的数字

      if( arr[j]<arr[j+1]){    // 相邻元素相比,小的移至到右边

       var temp = arr[j+1];

       arr[j+1] = arr[j];

       arr[j] = temp;

      }

    }

  }

      return arr[1];

}

7 猴子第一天摘下若干个桃子,当即吃掉一半,不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个,以后每天早上都吃掉剩下桃子的一半零一个,到第十天早上的时候,发现只剩下一个桃子了,问猴子第一天摘下多少个桃子?

function peach(day){
  var i=0,
     sum=0;
  for(var i=0;i<day;i++){
    sum = sum*2+1;
  }
  return sum;
}

8 设计一个3人斗地主的发牌算法(54张牌发给三个人,最后剩下3张)

// 洗牌算法,传入一个数组,随机乱序排列,不污染原数组
function shuffle(arr) {
  if (!arr) {
    throw '错误,请传入正确数组';
  }

  var newArr = arr.slice(0);
  for (var i = newArr.length - 1; i >= 0; i--) {
    // 随机范围[0,1)
    var randomIndex = Math.floor(Math.random() * (i + 1));
    var itemAtIndex = newArr[randomIndex];
    newArr[randomIndex] = newArr[i];
    newArr[i] = itemAtIndex;
  }

  return newArr;
}

// 生成一副扑克牌
function generatePoker() {
  // 第一步:定义四个花色,这里就用中文了
  var cardType = ['黑桃', '红桃', '梅花', '方块'];

  // 第二步:定义13张普通牌
  var cardValue = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];

  // 第三步:定义2张特殊牌,大王与小王
  var specialCard = ['大王', '小王'];

  // 第四步:根据上述数组生成54张牌
  var allCards = [];
  for (var i = 0,len1 = cardType.length; i < len1; i++) {
    for (var j = 0,len2 = cardValue.length; j < len2; j++) {
      allCards.push(cardType[i] + cardValue[j]);
    }
  }
  allCards = allCards.concat(specialCard);

  return allCards;
}

// 随机发N张扑克牌
function dealPoker(num) {
  if(!num || num>54 || typeof(num)!== 'number') {
  throw '错误,传入的数字非法,只能是[1-54]';
}
// 生成扑克牌
  var allCards = generatePoker();

// 洗牌-不污染原先的数组
  var randomCards = shuffle(allCards);

  return randomCards.slice(0, num);
}

// 测试用例
  console.log(dealPoker(3));
  console.log(dealPoker(4));
  console.log(dealPoker(10));

// 生成一副洗好的全新乱序牌
  var poker = dealPoker(54);
// 接下来如果想要发牌,依次将数组pop即可,因为它本身已经被打乱了,可以一直发完54张

9 简述QQ登录过程

  a.输入账号和密码,先进行前端的字符校验,是否符合填写规范

  b.点击登录,进行ajax请求,

  c.首先判断数据库里是否有这个账号,没有则给出提示该账号尚未注册

  d.判断输入的密码是否和数据库的密码一致

  e.如果一致返回状态成功,实现跳转,如果不一致,则给出提示,账号或密码错误

10 输入一个字符串,打印该字符串中字符的所有排列

function permutate(str) {
  var result = [];
  if(str.length > 1) {
    var left = str[0];
    var rest = str.slice(1, str.length);
    var preResult = permutate(rest);
    for(var i=0; i<preResult.length; i++) {
      for(var j=0; j<preResult[i].length; j++) {
        var tmp = preResult[i],slice(0, j) + left + preResult[i].slice(j, preResult[i].length);
        result.push(tmp);
      }
    }
  } else if (str.length == 1) {
    return [str];
  }
  return result;
}

 

觉得让一个前端三十分钟做完这些题目,是不是有点~~咳咳,不说了,还是努力提升自己吧,自己比较菜,还写不出来,有几个是从网上找的答案,先保存着,日后再慢慢消化吧~

原文地址:https://www.cnblogs.com/xuniannian/p/8583938.html