前端面試題大雜燴(二)

1、插入排序

	function insertSort(arr) {
        for (let i = 1; i < arr.length; i++) {  //下標從1開始,從後向前比較
            let current = arr[i];  //記錄當前元素
            let pre_index = i - 1;  //記錄前一個元素下標
            while (current < arr[pre_index] && pre_index >= 0) {
                arr[pre_index + 1] = arr[pre_index];
                pre_index--;
            }
            arr[pre_index + 1] = current;  //確定位置後,賦值
        }
        return arr;
    }

2、快速排序

	function quickSort(arr) {
        if (arr.length <= 1) return arr;
        let left = [],middle = [arr[0]], right = []; //定義三個數組,middle爲哨兵元素
        for (let index = 1; index < arr.length; index++) {
            if (arr[index] < middle[0]) {
                left.push(arr[index])
            }else {
                right.push(arr[index])  //本身一樣大的元素也放入右邊
            }
        }
        return quickSort(left).concat(middle, quickSort(right))  // 遞歸併連接
    }

3、二分查找(遞歸和非遞歸)

//非遞歸
function BianrySearch(arr,key){
    let left = 0,right = arr.length-1;
    while(left<=right){
        let mid = (left+right)/2;
        if(arr[mid]===key) return mid;
        if(key > arr[mid]){
            left = mid + 1;
        }else{
            right = mid - 1;
        }
    }
    return -1;
}

//遞歸
function BianrySearch(arr,left,right,key){
    if(left > right) return -1;
    let mid = parseInt((left+right)/2);
    if(key === arr[mid]) return mid;
    if(key > arr[mid]){
        BianrySearch(arr,mid+1,right,key);
    }else{
        BianrySearch(arr,left,mid-1,key);
    }
}

4、鏈表反轉

1、鏈表反轉可以一次查找鏈表保存到數組中,然後數組取反操作
2、(c)1 -> 2 -> 3 -> 4 -> 5
function reserveList(ListNode head){
	if (head != null && head.next != null) {
	      ListNode c = head;  //一直指向第一個元素(1)
	       ListNode b = null;   //反轉過程中活動的指針,暫存指針
	        while (c.next != null) { 
	             b = c.next;    //第一次執行時:b保存 ‘3’ 元素
	             c.next = c.next.next;   //直接讓 1 指向 3
	              b.next = head;  //把2調到最前面,讓 2 指向 1
	              head = b;  //調整head指針,由指向 1 變爲指向 2
	              //一次執行後:2 -> 1(c) -> 3 -> 4 -> 5
	         }
	  }
	  return head;  //返回反轉後的頭指針
}

5、命名方式的轉換

1、dom_abc => domAbc
	const str = 'dom_one'
	const reg = /\_(\w)/g;
	 //all第一個參數代表匹配的全部(_o),第二個參數是匹配的下一個(o)
	const str1 = str.replace(reg,(all,letter)=>{ 
		return letter.toUpperCase();
	})
	console.log(str1)  //domOne
	//還有一種方法是split('_')分割後,保存到數組中,然後遍歷
	
2、domAbc => dom_abc
	function toLine(name) {
		return name.replace(/([A-Z])/g,"_$1").toLowerCase();
	}

6、實現bind方法

	Function.prototype.bind2 = function(context) {
		//bind綁定的必須是函數
        if(typeof this !== 'function') throw new Error('this is not function!')  
        var self = this;
        var args = [...arguments].slice(1);;
        return function() {
            var args1 = [...args,...arguments]; //轉化成數組併合並參數
            self.apply(context, [...args1]);  //也可以使用call實現
        };
    }

7、分析打印結果

	function fun(n,o) {
		console.log(o);
		return {
		    fun: function (m) {
		    	//這裏的fun調用的是最外層的函數fun,不是return中的
			    return fun(n,m);//n==0,利用了閉包,保存了第一次傳的值
            }
		}
    }
    var a = fun(0); //undefined
	a.fun(1);//1
	a.fun(2);//2
	a.fun(3);//3

8、變量提升和函數提升問題

  函數提升優先級高於變量提升,其中函數提升前提是不能聲明爲函數表達式:var fun = function(){},且函數提升不會被變量提升覆蓋,可以被變量聲明可以覆蓋。

	console.log(a)   //打印函數a 
	function a() {
		return 'this is function';
    }
	console.log(a)  //打印函數a
    var a = 10;
	console.log(a);  //10
	var b = 20;
	var b;  //若重複聲明的語句無初始值,那麼不會對原先變量有任何影響
	console.log(b)  //20
	
	if(!(c in window)) {  // c in window 返回true
	    var c = 10;
	    console.log('in')
	}
	console.log(c)  //undefined

9、查找字符串出現的次數

function appear(str,target_str){
    let arr = [];
    let n = 0;
    while(str.indexOf(target_str,n) != -1 && n<str.length){
        arr.push(str.indexOf(target_str,n)); //第二個參數是開始查找的位置
        n = str.indexOf(target_str,n) + target_str.length; //更改位置,從下一個地方開始查找
    }
    return arr;
}
var arr = appear('abascbascbabasbascbascascbab','s');

10、不借助輔助空間,找出數組中不重複的元素

// [0,0,1,1,1,2,3,4,5]   
let i = 0,j=0;
for(i = 0;i<arr.length;i++){
    for(j = 0;j<arr.length;j++){
        if(arr[i]==arr[j] && i!=j) break;
    }
    if(j==arr.length) console.log(arr[i])  //3 4 5
}

持續更新,方便自己和大家查看。歡迎指出不足地方,共同進步

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