記幾個算法面試題


最近去面試,遇到很多算法類的題目,看的是一臉懵,故特此記錄下了此份試題,慢慢去研究里面的問題。

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

 

覺得讓一個前端三十分鍾做完這些題目,是不是有點~~咳咳,不說了,還是努力提升自己吧,自己比較菜,還寫不出來,有幾個是從網上找的答案,先保存着,日后再慢慢消化吧~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM