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
}