與函數有關面試題(一)

  1. 如何將字符串進行反轉
    解題思路:字符串本身沒有反轉方法,先將字符串轉爲數組,再用reverse()方法
    將字符串轉爲數組=》用slice(“”)方法,對數組進行空氣分割,轉化成數組。
    代碼如下:
   var abc="abcdergfdfgdfg";
    var def=abc.slice("");
    console.log(def.length);
    var result=[];
    function fun() {
        for (var i = 0; i < def.length; i++) {
            result[i] = def[i]
        }
        return result.reverse();
    }
    console.log(fun().toString());

最後得到的結果就是反轉後的字符串

2.檢測字符串是否爲迴文
如果給定的字符串是迴文,返回true,反之,返回false。
如果一個字符串忽略標點符號、大小寫和空格,正着讀和反着讀一模一樣,那麼這個字符串就是palindrome(迴文)。
思路如下:正則匹配出所有的標點符號,大小寫,空格,匹配後的結果與該結果反轉後值相等,則爲迴文,反之爲非迴文。
代碼如下:
方法1。正則表達式match匹配

function palindrome(str) {
var result=[];
var reg=/[0-9a-zA-Z\+]+/g;
str = str.match(reg).join("").toLowerCase();
for(var i=0;i<str.length;i++){
    result.push(str[i])
}
var newstr=result.reverse();
if(newstr.join("").toLowerCase()==str)  {
    return true;
}
else{
     return false;
 }
}
document.write(palindrome("eye123"));

方法二。正則表達式replace替換,正則表達式可以通過“^”符號作爲左方括號內的第一個字符,表示否定字符類=》非或者說取反。

function palindrome(str) {
var result=[];
str=str.replace(/[^[a-z0-9A-Z+]+/g,"");
for(var i=0;i<str.length;i++){
result.push(str[i]);
}
var newstr=result.reverse();
if(newstr.join("").toLowerCase()==str.toLowerCase())  {
return true;
}
else{
return false;
}
}
palindrome("eye");

3.M選N

<!DOCTYPE html>

<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Javascript</title>
</head>
<body>
<script >
    var st=new Date().getTime();
    function arrayCombine(targetArr) {
        if(!targetArr || !targetArr.length) {
            return [];
        }
        var len = targetArr.length;
        var resultArrs = [];

        // 所有組合
        for(var n = 1; n < len; n++) {
            var flagArrs = getFlagArrs(len, n);
            while(flagArrs.length) {
                var flagArr = flagArrs.shift();
                var combArr = [];
                for(var i = 0; i < len; i++) {
                    flagArr[i] && combArr.push(targetArr[i]);
                }
                resultArrs.push(combArr);
            }
        }
        return resultArrs;
    }
    /**
     * 獲得從m中取n的所有組合
     */
    function getFlagArrs(m, n) {
        if(!n || n < 1) {
            return [];
        }
        var resultArrs = [],
                flagArr = [],
                isEnd = false,
                i, j, leftCnt;
        for (i = 0; i < m; i++) {
            flagArr[i] = i < n ? 1 : 0;
        }
        resultArrs.push(flagArr.concat());
        while (!isEnd) {
            leftCnt = 0;
            for (i = 0; i < m - 1; i++) {
                if (flagArr[i] == 1 && flagArr[i+1] == 0) {
                    for(j = 0; j < i; j++) {
                        flagArr[j] = j < leftCnt ? 1 : 0;
                    }
                    flagArr[i] = 0;
                    flagArr[i+1] = 1;
                    var aTmp = flagArr.concat();
                    resultArrs.push(aTmp);
                    if(aTmp.slice(-n).join("").indexOf('0') == -1) {
                        isEnd = true;
                    }
                    break;
                }
                flagArr[i] == 1 && leftCnt++;
            }
        }
        return resultArrs;
    }
    var abs=getFlagArrs(20, 10);
    function index(){
        var result=[];
    for(var j=0;j<abs.length;j++) {
        for (var i = 0; i < abs[j].length; i++) {
                if (abs[j][i] == 1) {
                 result.push(i);
                }
        }
    }
        return result;
}
    function split_array(arr,len){
        var a_len=arr.length;
        var result1=[];
        for(var i=0;i<a_len;i+=len){
            result1.push(arr.slice(i,i+len))
        }
        return result1;
    }
 var s=split_array(index(),10);
 for(var key in s){
     console.log(s[key].join(" "))
 }
    var st2=new Date().getTime() - st;
console.log("上面代碼的執行時間爲"+st2+"毫秒");
</script>
</body>
</html>

4.找出字符串中最大的單詞
代碼如下:

   function findLongestWord(str) {
       str=str.split(" ");
        var j=str[0].length;
        for(var i=1;i<str.length;i++){
            if(j<str[i].length){
                j=str[i].length;
            }
        }
        return j;
    }
    console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));

5.將字符串變爲駝峯式,單詞首字母大寫,其餘小寫。
代碼如下:

    function titleCase(str) {
        str = str.split(' ');
        for (i = 0; i < str.length; i++) {
            str[i] = str[i].toLowerCase().split('');
            str[i][0] = str[i][0].toUpperCase();
            str[i] = str[i].join('');
        }

        return str.join(' ');
    }
    console.log(titleCase("i'm a little tea pot"));

5.找出二維數組中,每組數的最大值,並放入一個新集合。

 function largestOfFour(arr) {
         var result = [];
         for (var i = 0; i < arr.length; i++) {
             var max = arr[i][0];
             for (var j = 1; j < arr[i].length; j++) {
                 if (arr[i][j] > max) {
                     max = arr[i][j];
                 }
             }
             result.push(max);
         }
         return result;
     }
     largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])

6.一個函數,刪除數組中的值。第一個參數是待刪除的數組,其餘的參數是待刪除的值
代碼如下:
function destroyer(){
var args=[].slice.call(arguments),arr=args.shift();
for(var i=arr.length-1;i>=0;i--)
args.indexOf(arr[i])!=-1&&arr.splice(i,1);
return console.log(arr);
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

7.去除數組中所有的false, null, 0, NaN, undefined, “”(空字符串)
代碼如下:

function bouncer(arr) {
        for (var i= arr.length - 1;  i>-1; i--) {
            (arr[i] == undefined)&&arr.splice(i, 1);//判斷一個值等於null或者undefined,是則刪除該值
           (arr[i]==false)&&arr.splice(i, 1);//判斷一個值等於空字符串或者false或者0,是則刪除該值
            (isNaN(arr[i])&&typeof arr[i]=="number")&&arr.splice(i, 1);//判斷一個值全等於NAN,是則刪除該值
        }
        return console.log(arr);
    }
    bouncer([7, "ate", "", false, 9]);
    //should return [7, "ate", 9].
    bouncer(["a", "b", "c"]);
    //should return ["a", "b", "c"].
    bouncer([false, null, 0, NaN, undefined, ""]);
    // should return [].
    bouncer([1, null, NaN, 2, undefined]);
    //should return [1, 2].

8.函數記憶

        //什麼是函數記憶: 讓函數記住曾經處理過的參數以及參數對應的處理結果
        //爲什麼: 函數本身沒有記憶,導致重複計算
        //何時: 只要一個函數,可能反覆用於計算
        //如何: 閉包
        //判斷一個數是不是質數
    function isPrime1(n){
        if(n<=3) return true;
        else if(n%2==0) return false;
        else{
            for(var i=3;i<=Math.sqrt(n);i+=2){
                if(n%i==0) return false;
            }
            return true;
        }
    }
var isPrime2=(function(){
    var hash={};
    return function(n){
        if(n<=3) return true;
        else if(n%2==0) return false;
        else if(hash[n]!==undefined)
            return hash[n];
        else{
            for(var i=3;i<=Math.sqrt(n);i+=2){
                if(n%i==0) {
                    hash[n]=false;
                    return false;
                }
            }
            hash[n]=true;
            return true;
        }
    }
})();
//isPrime2:function(n){...}(hash:{...})

for(var i= 0,arr=[];i<1000000;i++){
    arr.push(
        parseInt(Math.random()*1000+9000)
    );
}
console.time("isPrime1");
for(var i= 0;i<arr.length;i++){
    isPrime1(arr[i]);
}
console.timeEnd("isPrime1");
console.time("isPrime2");
for(var i= 0;i<arr.length;i++){
    isPrime2(arr[i]);
}
console.timeEnd("isPrime2");

9.快速排序

var arr=[1,2,8,9,5,4,7];
function sortArr(arr){
    for(var i=1;i<arr.length;i++){
        var t=arr[i];
        var p=i-1;
       while(arr[p]>t&&p>=0){
           arr[p+1]=arr[p];
           p-=1;
       }
      arr[p+1]=t;
    }
}
sortArr(arr);
console.log(arr);

10.數組去重

var arr=[1,2,1,3,2,1,4,3,1,2];
function repeat1(arr){
  var result=[];
  for(var i=0;i<arr.length;i++){
    //for(var j=0;j<result.length;j++){
    //  if(arr[i]==result[j])
    //    break;
    //}
    //if(j==result.length)
    if(result.indexOf(arr[i])==-1)
      result.push(arr[i]);
  }
  return result;
}
function repeat2(arr){
  var result=[];
  var hash={};
  for(var i=0;i<arr.length;i++){
    if(hash[arr[i]]===undefined){
      hash[arr[i]]=1;
      result.push(arr[i]);
    }
  }
  return result;
}
function repeat3(arr){
  return arr.sort((a,b)=>a-b)
             .join("")
             .replace(/(\w)\1*/ig,kw=>kw[0])
             .split("");
}
arr=repeat3(arr);
console.log(String(arr));

//for(var i= 0,arr=[];i<1000000;i++){
//  arr.push(
//      parseInt(Math.random()*9000+1000)
//  );
//}
//console.time("repeat1");
//repeat1(arr);
//console.timeEnd("repeat1");
//console.time("repeat2");
//repeat2(arr);
//console.timeEnd("repeat2");

11.找到排序後的下標

function getIndexToIns(arr, num) {
 arr.push(num);
 arr.sort((a,b)=>a-b);
 for(var i=0;i<arr.length;i++){
     if(arr[i]==num){
         return (i);
     }
 }
}

getIndexToIns([40, 60], 50);
getIndexToIns([10, 20, 30, 40, 50], 35)
//should return 3.
getIndexToIns([10, 20, 30, 40, 50], 30)
//should return 2.
getIndexToIns([40, 60], 50)
//should return 1.
getIndexToIns([3, 10, 5], 3)
//should return 0.
getIndexToIns([5, 3, 20, 3], 5)
//should return 2.
getIndexToIns([2, 20, 10], 19)
//should return 2.
getIndexToIns([2, 5, 10], 15)
//should return 3.

12.rot13解碼

function rot13(str) { // LBH QVQ VG!
    var arr = str.toUpperCase().split(" ");
    var str1 = [];
    for (var i = 0; i < arr.length; i++) {
        var arr1 = arr[i].split("");
        for (var j = 0; j < arr1.length; j++) {
            var num = arr1[j].charCodeAt();
            if (num >= 65 && num <= 90) {
                arr1[j] = num + 13 > 90 ? String.fromCharCode(64 + (num + 13 - 90)):String.fromCharCode(num + 13);  //64 + (num + 13 - 90) 要明白爲什麼是64 ,
            }

        }
        str1.push(arr1.join(""));
    }
    return str1.join(" ");
}

// Change the inputs below to test
console.log(rot13("SERR PBQR PNZC"));

13.找出兩個數組的不同項
代碼如下:
注意:NaN的布爾值是false;

function diffArray(arr1, arr2) {
    var c=[];
    // Same, same; but different.
    var newArr=arr1.concat(arr2);
    var o={};
    for(var i=0;i<newArr.length;i++){
        (newArr[i] in o)? o[newArr[i]]++ : o[newArr[i]] = 1 ;
    }
    for (var x in o) if (o[x] == 1) {c.push(x);}
    for(var i=0;i<c.length;i++){
        if(parseInt(c[i])){
            c[i]=parseInt(c[i])
        }
      }
    return c;
}

14.阿拉伯數字轉成羅馬數字

var convertToRoman = function(num) {

  var decimalValue = [ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ];
  var romanNumeral = [ 'M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I' ];

  var romanized = '';

  for (var index = 0; index < decimalValue.length; index++) {
    while (decimalValue[index] <= num) {
      romanized += romanNumeral[index];
      num -= decimalValue[index];
    }
  }

  return romanized;
}
convertToRoman (36);

更多函數式編程筆試題,請查看與函數有關面試題(二)………

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章