主頁 > 前端設計 > JavaScript之演算法設計思想

JavaScript之演算法設計思想

2021-10-31 08:37:21 前端設計

資料結構和演算法

    • 1??排序演算法
      • 一、冒泡排序
      • 二、選擇排序
      • 三、插入排序
      • 四、歸并排序
      • 五、快速排序
    • 2??查找方法
      • 一、順序查找
      • 二、二分查找
    • 3??演算法設計思想
      • 一、動態規劃
      • 二、分而治之
      • 三、貪心演算法
      • 四、回溯演算法

1??排序演算法

一、冒泡排序

  1. 比較所有相鄰的元素,如果第一個比第二個大,則交換他們的位置
  2. 一輪比較可以保證最后一個數是最大的,然后繼續遍歷剩余的數
  3. 代碼實作
const arr = [5,4,3,7,0,2,1]
let temp = 0;
//執行arr.length-1次陣列中冒泡的程序
for(let i = 0; i < arr.length -1; i++){
	//遍歷整個陣列,將陣列中最小的一個移動到陣列最后面
	//因為每一輪回圈后,都是將陣列中最小的移動到后面,所以arr.length-i,陣列末尾已經是最小元素就不再遍歷了
    for(let j = 0; j < arr.length - i; j++){
    //將如果相鄰元素中,第一個比第二個大,則第一個元素向后移
        if(arr[j]>arr[j+1]){
            temp = arr[j+1];
            arr[j+1] = arr[j];
            arr[j] = temp
        }
    }
}

二、選擇排序

  1. 找到未排序的陣列中的最小值,將他和第一位互換位置
  2. 找到未排序陣列中第二小的值,選中并將其放置在第二位
  3. 執行n-1輪后得到的就是一個升序陣列
  4. 代碼實作
const arr = [5,4,3,7,0,2,1]
let temp = 0;
//執行arr.length-1次選擇
for(let i = 0; i < arr.length - 1; i++){
	//遍歷整個陣列
	//一輪回圈陣列中最小的元素保證在第一位,后續回圈以此類推
	//所以每一輪回圈結束,陣列前面都是交換出來的最小值
	//使j=i,可以在后續遍歷中忽略前面已經確認的較小值
    for( let j = i; j < arr.length - 1; j++){
    //如果陣列中存在元素小于第一位,則兩者互換位置-
        if(arr[j] > arr[j+1]){
            temp = arr[j+1];
            arr[j+1] = arr[i];
            arr[i] = temp
        }
   
    }    
}

三、插入排序

  1. 從第二個數開始往前比
  2. 遇到大于自己的就將其(大值)位置向后移一位,小于自己的就插入到這個值后面
  3. 以此類推執行n-1次

const arr = [0,5,2,6,1,9]
//因為是從第二位開始比所以i=1開始
for(let i = 1; i < arr.length; i++){
    let temp = arr[i];
    let j = i;
    while( j > 0){
        if( arr[j-1] > temp ){
            //將大于當前元素的值向后移
            arr[j] = arr[j-1]
        }
        //當前元素大于前面元素時跳出回圈,比較下一位
        //這里break跳出的是while回圈,因為前面的元素比較過了,都是有序的陣列,所以當arr[j-1] < temp是可以判斷temp比之前所有的元素都大,跳出本次回圈即可
        else break;
        // j-=1如果放在if前面,當前元素大于前面值時arr[j] = temp依然會將當前元素插入到前面的位置
        //而放在后面break跳出回圈j-=1沒有執行,相當于arr[j] = arr[j],插入操作值未改變
        j -= 1;
    }
//交換元素位置(此時j已經執行了-1操作),如果是通過break跳出來的,實際上j并未發生改變,arr[j] = temp相當于給自身賦值
    arr[j] = temp;
}
//console.log(arr)

四、歸并排序

  1. 分:把陣列從中間分成兩半,在不斷遞回的對陣列進行“分”的操作,直到分成一個個只存在單獨數的陣列
  2. 合:把不能再分的兩個陣列合并為有序陣列,然后再對有序陣列進行合并,直到全部子陣列合并為一個完整的陣列

合并方法:

  1. 新建一個空陣列res用于存放最終排序后的陣列
  2. 比較兩個有序陣列的頭部·,較小者出隊(將拆分后的陣列視為為佇列)并推入res陣列中
  3. 如果陣列還有值就重復一二步操作

代碼實作

const merge = (arr) => {
    // 如果陣列長度為1,相當于不能再拆分時回傳這些單個陣列
    if(arr.length === 1) {return arr;}
    // 獲取陣列的中間值
    const mid = Math.floor(arr.length / 2)
    // 將陣列從中間拆分成開,記為左右新兩個陣列
    const left = arr.slice(0,mid)
    const right = arr.slice(mid,arr.length)

    // 遞回拆分
    const orderLeft = merge(left)
    const orderRight = merge(right)
    let res = []
    //當拆分后的陣列不為空時
    while(orderLeft.length || orderRight.length){
        // 如果拆分后左右都存在就比較頭元素的大小
        if(orderLeft.length && orderRight.length){
            // 將頭元素較小的取出然后加到res陣列中
            res.push(orderLeft[0] < orderRight[0] ? orderLeft.shift() : orderRight.shift())
            // 拆分后只有左邊陣列存在
        }else if(orderLeft.length){
            res.push(orderLeft.shift())
            // 拆分后只有右邊陣列存在
        }else if(orderRight.length){
            res.push(orderRight.shift())
        }
    }
    return res;
}
const arr = [1,4,3,9,2]
console.log(merge(arr))

五、快速排序

  1. 磁區: 從陣列中任意選擇一個基準,比基準大的元素放在基準后面,比基準小的元素放在基準前面
  2. 遞回: 磁區后得到的陣列左邊都比基準值小,右邊都比基準值大,然后遞回的對基準值前后的子陣列再進行磁區

代碼實作

const fastSort = (arr) => {
    if(arr.length === 0) {return arr;}
    // 定義左右兩個陣列,大于基準的放右邊陣列,小于基準的放左邊基準
    const left = []
    const right = []
    // 基準是隨機挑選的一個數
    const stand = arr[0]
    // 因為陣列第一個數被挑出來作為基準了,所以這里i從1開始
    for(let i = 1; i < arr.length; i++){
        if(arr[i] < stand){
            left.push(arr[i])
        }else{
            right.push(arr[i])
        }
    }
    // 這里左陣列、右陣列、基準為三個獨立的部分,需要將三者合成一個陣列
    //...是ES6中新增的擴展運算子,陣列中的擴展運算子(…)用于取出引數陣列中的所有可遍歷屬性,拷貝到當前陣列之中,
    return [...fastSort(left),stand,...fastSort(right)]
}
const arr = [1,4,0,3,7]
console.log(fastSort(arr))

但是其實這種快速排序方法是錯誤的,雖然也是利用快速排序的原理左右磁區然后遞回,但是使用了兩個陣列,空間復雜度增加

下面因該是比較貼切一點的快速排序,可以使用console.time()方法來測驗一下排序用時

// 計算程式執行時間
console.time('a')
// 函式傳入三個引數,依次是:待排序的陣列,待排序陣列左邊第一個元素的索引,待排序元素右邊得第一個元素的索引
const fastSort = (arr,began,end) => {  
    // 取陣列的第一個元素為基準值
    let print = arr[began]
    //如果不定義i,j 直接改變began,end的值,會影響后面遞回開始和結束的索引值
    let i = began;
    let j = end;
    //當左邊的索引值大于右邊的時,說明本輪排序結束
    if(began >= end) {
        // 將本輪排序后的陣列回傳
        return arr
    }
    //把所有比基準值小的元素放在基準值左邊,大的元素放在基準值右邊
    while(i < j){
        // 從后往前查找到比基準值小的元素交換
        //繼續判斷i<j是因為:如果print值較小,arr[j]>print會持續成立,導致j<=i,索引j<=i表示整個陣列已經排序結束
        while(arr[j] >= print && i < j){
            j--
        }
        // 比基準值小的元素放左邊,如果不存在比基準值小的元素,此時j=i相當于自身給自身賦值
        arr[i] = arr[j] 
        // 找到比基準值大的元素交換
        // 繼續判斷i<j,因為print值較大時,arr[i] <= print會持續成立,導致j<=i
        while(arr[i] <= print && i < j){
            i++
        }
        // 比基準值大的元素放在右邊,如果不存在比基準值大的元素,此時i=j相當于自身給自身賦值
        arr[j] = arr[i]       
    }
    //一次回圈結束,將基準值放在中間位置(此時i=j,arr[i]或者arr[j]都可以)
    arr[j] = print
    //遞回,繼續對基準值左右兩邊的陣列進行排序
    // 這里began不能直接傳入0,會影響到第三輪之后的遞回,
    // 因為對基準值右邊的陣列再進行磁區排序時也會使用到began,而此時began并不是0
    fastSort(arr,began,j-1)
    fastSort(arr,j+1,end)
    //回傳排序后的陣列
    return arr
}	 	  
const arr = [9,5,1,4,8]
console.log(fastSort(arr,0,arr.length-1))
console.timeEnd('a')

之所以從右邊開始排序,是因為基準值選擇的是最左邊,舉個例子7 1 2 3 4執行快速排序,假如從左開始排,就會出現1,7,2,3,4

附:這里有一個25w個資料的亂序陣列(有重復),可以用來測驗這些排序演算法的速度 https://download.csdn.net/download/aaahuahua/34715763

2??查找方法

搜索:js中通常使用indexOf方法(回傳元素在陣列中的下標,不存在返會-1)

一、順序查找

  1. 遍歷陣列
  2. 找到和目標值相等的元素,回傳下標
  3. 遍歷所有值后如果沒有目標值回傳-1

代碼實作

// 在Array陣列原型上添加一個方法
Array.prototype.searchWay = function (item){
// this指代這個陣列
    for(let i = 0; i < this.length; i++){
        if(item === this[i]){
            return i
        }
    }
    return -1
}
const arr = [1,3,5,2,9]
//呼叫searchWay方法
console.log(arr.searchWay(5))

二、二分查找

前提: 查找的是有序陣列

如果是一個無序陣列,需要先將其化為有序陣列之后再進行二分搜索

搜索方法

  1. 從中間元素開始,如果正好是目標值,則搜索結束
  2. 如果目標值小于或者大于中間元素,則在大于或者小于目標值的部分陣列中繼續進行搜索
// 在陣列的原型上添加一個search方法
Array.prototype.search = function (item){4
    // 定義查找的起始位置和結束位置
    let low = 0;
    let height = this.length - 1;
    // 等于號用于判斷陣列中只剩下最后一個數時,是否為目標值
    while(low <= height){
        // 選取陣列中間元素為基準值
        let mid = Math.floor((low + height) / 2);
        const num = this[mid]
        // 如果目標值就是基準值則回傳基準值的下標
        if(item === num){    
            return console.log(mid)
        }else if(item > num){ //當目標值大于基準值時,將查找范圍縮小為基準值右邊的陣列
            low = mid + 1
        }else if(item < num ){//當目標值小于基準值時,將查找范圍縮小為基準值左邊的陣列
            height = mid - 1
        }
    }
    // 查找結束后如果還是沒有找到目標元素,則回傳該元素不存在
    return console.log("該元素不存在")
}
//呼叫陣列原型上的search方法
const arr = [1,2,3,4,5].search(0)

3??演算法設計思想

一、動態規劃

將一個問題分解成相互重疊的子問題,通過反復求解子問題,來解決原來的問題

步驟:

  1. 定義子問題
  2. 回圈執行子問題中定義的公式

實戰練習

假設你正在爬樓梯,需要 n 階你才能到達樓頂,
每次你可以爬 1 或 2 個臺階,你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數,

輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂,
1 階 + 1 階 + 1 階
1 階 + 2 階
2 階 + 1 階

動態規劃

  1. 定義子問題,到達第n階可以有兩種方法
    (1)從第n-1階爬一階
    (2)從第n-2階爬兩階

所以到達第n階的方法就是到達第n-1階的方法加上到達第n-2階方法之和:F(n)=F(n-1)+F(n-2)

  1. 從n=2開始回圈執行F(n)=F(n-1)+F(n-2)

代碼實作


var climbStairs = function(n) {
//當階數小于2,也就是1階時,直接回傳1(n為正整數所以不存在復數的情況)
    if(n<2) return 1;
//定義陣列dp存放到達每一階的方法數,下標代表階數,對應值為到達改階的方法數
//雖然這里0階定義的是1,但是n為正整數,不會存在n=0的情況
    const dp = [1,1];
//因為前兩次已經被列舉出來了,所以i從2開始
    for(let i = 2;i <= n; i++){
        dp[i]=dp[i-1]+dp[i-2]
    }
    return dp[n]
};

//代碼優化,因為定義了陣列,所以空間復雜度為O(n),可以只定義兩個變數將復雜度降到O(1)
var climbStairs = function(n) {
    if(n<2) return 1;
    const dp0 = 1;
    const dp1 = 1;
    for(let i = 2;i <= n; i++){
    //臨時存盤到達第n-2階的方法
        const temp = dp0;
        dp0 = dp1;
        dp1 = temp + dp1;
    }
    return dp1;
};

二、分而治之

將原問題為很多個相似的小問題,遞回的解決這些小問題,然后再將結果并以解決原有的問題

1. 設計案例之歸并排序

  • 分:將陣列一分為二
  • 解:遞回的對兩個子陣列進行歸并排序
  • 合:合并有序陣列(將遞回后長度為1的陣列合并成有序陣列,然后再把這些有序陣列繼續合并)

2. 設計案例之快速排序

  • 分:選擇基準值將原陣列分成大于基準值和小于基準值的兩個陣列
  • 解:遞回的對兩個子陣列進行快速排序
  • 合:遞回到陣列中只剩下一個·元素時排序完畢,回傳該陣列即可

實戰練習

猜數字游戲的規則如下:

每輪游戲,都會從 1 到 n 隨機選擇一個數字, 請你猜選出的是哪個數字,如果你猜錯了,我會告訴你,你猜測的數字比我選出的數字是大了還是小了,

你可以通過呼叫一個預先定義好的介面 int guess(int num) 來獲取猜測結果,回傳值一共有 3 種可能的情況(-1,1 或 0):

  1. -1:選出的數字比你猜的數字小 pick < num
  2. 1:選出的數字比你猜的數字大 pick > num
  3. 0:選出的數字和你猜的數字一樣,恭喜!你猜對了!pick == num 回傳選出的數字,

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/guess-number-higher-or-lower

示例 1: 輸入:n = 10, pick = 6 輸出:6
示例 2:輸入:n = 1, pick = 1 輸出:1
示例 3:輸入:n = 2, pick = 1 輸出:1
示例 4:輸入:n = 2, pick = 2 輸出:2

解題思路:

使用二分搜索,分,解,和,利用分而治之的思想來做

  1. 分:計算中間元素,分割陣列
  2. 解:遞回的在較大的或者較小的陣列中進行二分搜索
  3. 合:這一步可以省略,因為如果在子陣列中搜索到目標值后就直接將其回傳了

代碼實作:

var guessNumber = function(n) {
//這里定義一個二分查找的函式
    const divide = (low,height) => {
    //當最小值大于最大值時直接return
        if(low > height) return;
        //取兩個數的中間值
        const mid = Math.floor((low+height)/2);
        //呼叫介面判斷猜測結果是否正確
        const res = guess(mid);
        if(res === 0 ){
            return mid
        }else if(res === -1){
        //猜測結果小于真實值
            return divide(1,mid-1)
        }else if(res === 1 ){
        //猜測結果大于真實值
            return divide(mid+1,height)
        }
    }
    return divide(1,n)
};

對稱二叉樹

給定一個二叉樹,檢查它是否是鏡像對稱的,

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的,
在這里插入圖片描述
但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:
在這里插入圖片描述

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/symmetric-tree

解題思路:

可以轉換為左右子樹是否為鏡像的,然后分解為樹1的左子樹和樹2的右子樹是否為互為鏡像,樹1右子樹和樹2的左子樹是否為互為鏡像

代碼實作:

var isSymmetric = function(root) {
//如果二叉樹為空,回傳為true
  if(!root) return true;
  //定義一個鏡像判斷函式
  const isCheck = (left,right) => {
  //如果左右子樹都不存在,回傳為true
      if(!right && !left){
          return true
      }
      //左右子樹存在,值相等,遞回左右子節點
      if(right && left && right.val === left.val &&
        isCheck(left.left,right.right) &&
        isCheck(left.right,right.left)
      ){
          return true
      }
      //其他情況下回傳false
      return false
  }
    return isCheck(root.left,root.right)
}; 

三、貪心演算法

期盼通過每個階段的區域最優選擇,從而達到全域的最優,但是結果有可能并不是最優的

分發餅干

假設你是一位很棒的家長,想要給你的孩子們一些小餅干,但是,每個孩子最多只能給一塊餅干,

對每個孩子 i,都有一個胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個尺寸 s[j] ,如果 s[j] >= g[i],我們可以將這個餅干 j 分配給孩子 i ,這個孩子會得到滿足,你的目標是盡可能滿足越多數量的孩子,并輸出這個最大數值,

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/assign-cookies

示例1:

輸入: g = [1,2,3], s = [1,1]
輸出: 1
解釋: 你有三個孩子和兩塊小餅干,3個孩子的胃口值分別是:1,2,3,
雖然你有兩塊小餅干,由于他們的尺寸都是1,你只能讓胃口值是1的孩子滿足, 所以你應該輸出1,

示例2:

輸入: g = [1,2], s = [1,2,3]
輸出: 2
解釋:
你有兩個孩子和三塊小餅干,2個孩子的胃口值分別是1,2,
你擁有的餅干數量和尺寸都足以讓所有孩子滿足,
所以你應該輸出2.

解題思路:

區域最優:分發的餅干既能滿足孩子,還消耗最少,即先將較小的餅干分給胃口小的孩子

解題步驟:

  1. 對餅干陣列和胃口陣列進行升序排序
  2. 遍歷餅干陣列,找到能滿足第一個孩子(胃口最小的孩子)的餅干
  3. 繼續遍歷餅干陣列,找到剩下能滿足第二、第三、第四…個孩子的餅干

代碼實作:

var findContentChildren = function(g,s) {
//快速排序
    const fastSort = (arr,began,end) => {
        let print = arr[began]
        let i = began;
        let j = end;
        if(began >= end){
            return arr;
        }
        while(i < j){
            while(arr[j] >= print && i < j){
                j--
            }
            arr[i] = arr[j]
            while(arr[i] <= print && i < j){
                i++
            }
            arr[j] = arr[i];
        }
        arr[j] = print;
        fastSort(arr,began,j-1)
        fastSort(arr,j+1,end)
        return arr
    } 
    //對小孩的胃口和餅干尺寸兩個陣列進行排序
    fastSort(s,0,s.length-1)
    fastSort(g,0,g.length-1)
    //定義能滿足的小孩個數
    let i = 0;
    //遍歷所有餅干
    s.forEach(item =>{
    //如果餅干尺寸大于小孩的胃口,能滿足的小孩數加1
        if(item >= g[i]){
            i+=1
        }
    })
    //回傳滿足的小孩個數
    return i
};

四、回溯演算法

一種漸進式尋找并構建問題解決方式的策略,即從一個可能的情況開始解決問題,如果不行,就回溯到另一種情況,直到問題被解決(也可以理解為暴力破解)

回溯思路

  1. 使用遞回模擬出所有的情況
  2. 遇到不滿足條件的情況就回溯
  3. 收集所有能到達遞回終點的情況,并回傳

實戰練習

全排列規則如下:

給定一個不含重復數字的陣列 nums ,回傳其 所有可能的全排列 ,你可以 按任意順序回傳答案,


示例 1:

輸入:nums = [1,2,3]
輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:
輸入:nums = [0,1]
輸出:[[0,1],[1,0]]

示例 3:
輸入:nums = [1]
輸出:[[1]]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/permutations

代碼實作

var permute = function(nums) {
	//定義結果集
    let res = []
    //定義已排列結果
    let way = []
    //used(標記陣列),用于記錄當前該元素是否已經被添加到已排列陣列(way)中了
    const backtrack = (arr,used) =>{
    //遞回結束條件,當已排列陣列的長度等于原陣列長度時,表明所有元素都已經被添加到已排列陣列中了
        if(way.length === arr.length) {
            //將本次排列的結果添加到結果集中
            res.push([...way])
            return;
        }
        // 遍歷陣列
        for(let i = 0; i < arr.length; i++){

    // if(way.indexOf(arr[i]) != -1)
    //  不使用這個方法是因為查找的時間復雜度為O(n),同樣的引入used陣列會增加空間復雜度也是O(n)

            // undefind轉換為布林值是false
            if(used[i])  // 判斷該元素是否已經存在于已排列陣列中
            continue;
            //向結果集中添加元素
            way.push(arr[i])
            //標記該元素為已添加,使下一層遍歷能夠區分哪些元素是未排列的剩余元素
            used[i] = true
            // 遞回遍歷陣列,遞回遍歷arr.length次就可以將陣列中的元素全部添加到排列陣列中
            backtrack(arr,used)
            // 這個是本次全排列中回溯的重要體現
            // 使用pop方法洗掉已經添加到排列陣列中的元素,可以使排列程序回到上一層遞回
            way.pop()
            // 洗掉已經添加到排列陣列中的元素標記
            used[i] = false
        }    
    }
    backtrack(nums,[])
    return res
};

子集規則如下

給你一個整數陣列 nums ,陣列中的元素 互不相同 ,回傳該陣列所有可能的子集(冪集),
解集不能包含重復的子集,你可以按任意順序回傳解集,

示例 1:
輸入:nums = [1,2,3]
輸出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:
輸入:nums = [0]
輸出:[[],[0]]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/subsets

代碼實作

const subsets = (nums) => {
    const res = [];
    const sun = (index, temp) => {
      if (index == nums.length) { // 索引等于陣列長度時
        res.push(temp.slice());   // 加入解集
        return;                   // 結束當前的遞回
      }
      temp.push(nums[index]); // 將該元素加入陣列
      sun(index + 1, temp);   // 往下遞回,添加剩余元素
      temp.pop();             // 上面的遞回結束,逐步洗掉已經添加過的元素
      // 洗掉已添加的元素后,將剩余結果加入結果集;操作剩余元素
      sun(index + 1, temp);   
    };
    sun(0, []);
    return res;
  };

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/342238.html

標籤:其他

上一篇:Node.js記憶體泄漏的原因竟然是……?

下一篇:HTML5七夕情人節表白網頁制作——藍色夢幻海洋3D相冊—— HTML+CSS+JavaScript

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more