zoukankan      html  css  js  c++  java
  • 记几个算法面试题

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

    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;
    }

     

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

  • 相关阅读:
    Navicat Premium 12.1.12.0破解版激活
    vConsole调试器
    使用DbFunctions来解决asp.net mvc ef按照日期分组数据
    谷歌浏览器如何安装CRX插件?crx离线插件安装方法
    ASP.NET MVC——CodeFirst开发模式
    Sql server 事务的两种用法
    SQL Server 存储过程
    JqueryMobile新手问题大全
    .net core 轻量级容器 ServiceProvider 源码分析
    Centos7 使用Docker 部署mssql 2017
  • 原文地址:https://www.cnblogs.com/xuniannian/p/8583938.html
Copyright © 2011-2022 走看看