【2024年華為OD機試】 (B卷,100分)- 流水線(Java JS PythonC/C++)

在這里插入圖片描述

一、問題描述

題目描述

一個工廠有 m 條流水線,來并行完成 n 個獨立的作業,該工廠設置了一個調度系統,在安排作業時,總是優先執行處理時間最短的作業。

現給定流水線個數 m,需要完成的作業數 n,每個作業的處理時間分別為 t1, t2, ..., tn。請你編程計算處理完所有作業的耗時為多少?

n > m 時,首先處理時間短的 m 個作業進入流水線,其他的等待,當某個作業完成時,依次從剩余作業中取處理時間最短的進入處理。

輸入描述

第一行為2個整數(采用空格分隔),分別表示流水線個數 m 和作業數 n

第二行輸入 n 個整數(采用空格分隔),表示每個作業的處理時長 t1, t2, ..., tn

  • 0 < m, n < 100
  • 0 < t1, t2, ..., tn < 100

注:保證輸入都是合法的。

輸出描述

輸出處理完所有作業的總時長。

用例

用例 1

輸入:

3 5
8 4 3 2 10

輸出:

13

題目解析

簡單的邏輯題。解題思路如下:

題目說“總是優先執行處理時間最短的作業”,因此我們可以將 8 4 3 2 10 進行升序排序變為 2 3 4 8 10,然后依次將排序后元素投入對應流水線中,如下圖所示:

流水線1: 2 -> 8 -> 10 (總耗時: 2 + 8 + 10 = 20)
流水線2: 3 -> 10 (總耗時: 3 + 10 = 13)
流水線3: 4 (總耗時: 4)

計算每條流水線的時間總和,最大的那個就是題解。

詳細步驟

  1. 讀取輸入

    • 讀取流水線個數 m 和作業數 n
    • 讀取每個作業的處理時間 t1, t2, ..., tn
  2. 排序

    • 將作業處理時間按升序排序。
  3. 初始化流水線

    • 創建一個數組 lines,長度為 m,初始化為 0,表示每條流水線的當前總耗時。
  4. 分配作業

    • 遍歷排序后的作業處理時間,依次將作業分配到當前總耗時最小的流水線中。
    • 更新該流水線的總耗時。
  5. 輸出結果

    • 輸出所有流水線中最大總耗時。

用例解釋

用例 1
  • 輸入:
    • m = 3
    • n = 5
    • t = [8, 4, 3, 2, 10]
  • 輸出:
    • 13

解釋

  • 排序后的作業處理時間:[2, 3, 4, 8, 10]
  • 分配作業:
    • 流水線1: 2 -> 8 -> 10 (總耗時: 2 + 8 + 10 = 20)
    • 流水線2: 3 -> 10 (總耗時: 3 + 10 = 13)
    • 流水線3: 4 (總耗時: 4)
  • 最大總耗時為 13,因此輸出 13。
    在這里插入圖片描述

通過上述步驟,我們可以高效地計算處理完所有作業的總時長。這種方法的時間復雜度主要由排序操作決定,為 O(n log n),其中 n 是作業數。

二、JavaScript算法源碼

以下是 JavaScript 代碼 的詳細中文注釋和講解:


JavaScript 代碼

/* JavaScript Node ACM模式 控制臺輸入獲取 */
const readline = require("readline"); // 引入 readline 模塊,用于讀取控制臺輸入// 創建 readline 接口實例
const rl = readline.createInterface({input: process.stdin,  // 輸入流為標準輸入output: process.stdout, // 輸出流為標準輸出
});const lines = []; // 定義一個數組 lines,用于存儲輸入的行數據// 監聽 'line' 事件,每次讀取一行輸入
rl.on("line", (line) => {lines.push(line); // 將當前行數據存入 lines 數組// 當 lines 數組中有 2 行數據時,開始處理輸入if (lines.length === 2) {// 解析第一行輸入let [m, n] = lines[0].split(" ").map((ele) => parseInt(ele)); // 將第一行按空格分割,并轉換為整數// 解析第二行輸入let times = lines[1].split(" ") // 將第二行按空格分割.slice(0, n) // 只取前 n 個元素.map((ele) => parseInt(ele)); // 將每個元素轉換為整數times.sort((a, b) => a - b); // 對 times 數組進行升序排序let mArr = new Array(m).fill(0); // 創建一個長度為 m 的數組 mArr,初始值為 0// 遍歷 times 數組,將每個任務分配給當前負載最小的機器times.forEach((time, idx) => {mArr[idx % m] += time; // 將任務分配給 idx % m 號機器});console.log(Math.max(...mArr)); // 輸出 mArr 數組中的最大值,即所有機器中最大的負載lines.length = 0; // 清空 lines 數組,為下一次輸入做準備}
});

代碼講解

1. 輸入部分
  • readline 模塊
    • 使用 readline 模塊讀取控制臺輸入。
    • 通過 rl.on("line", ...) 監聽每一行輸入。
  • lines 數組
    • 用于存儲輸入的行數據。
    • lines 數組中有 2 行數據時,開始處理輸入。
2. 數據處理部分
  • 解析第一行輸入
    • 使用 split(" ") 將第一行按空格分割。
    • 使用 map((ele) => parseInt(ele)) 將分割后的字符串轉換為整數。
    • 提取 m(機器數量)和 n(任務數量)。
  • 解析第二行輸入
    • 使用 split(" ") 將第二行按空格分割。
    • 使用 slice(0, n) 只取前 n 個元素。
    • 使用 map((ele) => parseInt(ele)) 將分割后的字符串轉換為整數。
  • 排序
    • times 數組進行升序排序,確保任務按時間從小到大分配。
3. 任務分配部分
  • mArr 數組
    • 創建一個長度為 m 的數組 mArr,初始值為 0。
    • 用于記錄每臺機器的總負載。
  • 任務分配邏輯
    • 遍歷 times 數組,將每個任務分配給當前負載最小的機器。
    • 使用 idx % m 實現輪詢分配。
4. 輸出部分
  • Math.max(...mArr)
    • 計算 mArr 數組中的最大值,即所有機器中最大的負載。
    • 使用 console.log 輸出結果。
5. 清空 lines 數組
  • 在處理完當前輸入后,清空 lines 數組,為下一次輸入做準備。

示例運行

輸入 1
3 5
1 2 3 4 5
  • 輸出
    7
    
  • 解釋
    • m = 3(3 臺機器),n = 5(5 個任務)。
    • 任務時間數組為 [1, 2, 3, 4, 5]
    • 分配結果:
      • 機器 0:1 + 4 = 5
      • 機器 1:2 + 5 = 7
      • 機器 2:3 = 3
    • 最大負載為 7
輸入 2
2 4
3 1 7 2
  • 輸出
    8
    
  • 解釋
    • m = 2(2 臺機器),n = 4(4 個任務)。
    • 任務時間數組為 [1, 2, 3, 7](排序后)。
    • 分配結果:
      • 機器 0:1 + 7 = 8
      • 機器 1:2 + 3 = 5
    • 最大負載為 8

總結

  • 該代碼通過輪詢分配的方式,將任務分配給負載最小的機器。
  • 使用 readline 模塊讀取控制臺輸入,并動態處理輸入數據。
  • 如果有其他問題,歡迎繼續提問!

三、Java算法源碼

以下是 Java 代碼 的詳細中文注釋和講解:


Java 代碼

import java.util.Arrays; // 導入 Arrays 工具類,用于數組排序和流操作
import java.util.Scanner; // 導入 Scanner 類,用于讀取控制臺輸入public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in); // 創建 Scanner 對象,用于讀取輸入int m = sc.nextInt(); // 讀取機器數量 mint n = sc.nextInt(); // 讀取任務數量 nint[] times = new int[n]; // 定義數組 times,用于存儲每個任務的執行時間for (int i = 0; i < n; i++) times[i] = sc.nextInt(); // 讀取每個任務的執行時間并存入 times 數組System.out.println(getResult(m, n, times)); // 調用 getResult 方法計算結果并輸出}/*** 計算所有機器中最大的負載* @param m 機器數量* @param n 任務數量* @param times 每個任務的執行時間數組* @return 所有機器中最大的負載*/public static int getResult(int m, int n, int[] times) {Arrays.sort(times); // 對任務執行時間數組進行升序排序int[] mArr = new int[m]; // 定義數組 mArr,用于記錄每臺機器的總負載for (int i = 0; i < n; i++) {mArr[i % m] += times[i]; // 將任務分配給當前負載最小的機器(輪詢分配)}return Arrays.stream(mArr).max().orElse(0); // 返回 mArr 數組中的最大值(最大負載)}
}

代碼講解

1. 輸入部分
  • Scanner
    • 使用 Scanner 類讀取控制臺輸入。
    • 通過 sc.nextInt() 依次讀取機器數量 m、任務數量 n 以及每個任務的執行時間。
  • times 數組
    • 用于存儲每個任務的執行時間。
    • 通過循環讀取輸入并存入 times 數組。
2. 數據處理部分
  • 排序
    • 使用 Arrays.sort(times)times 數組進行升序排序,確保任務按執行時間從小到大分配。
  • 任務分配
    • 定義數組 mArr,用于記錄每臺機器的總負載。
    • 使用循環將任務分配給當前負載最小的機器(通過 i % m 實現輪詢分配)。
3. 輸出部分
  • Arrays.stream(mArr).max().orElse(0)
    • 使用流操作計算 mArr 數組中的最大值(即所有機器中最大的負載)。
    • 如果數組為空,則返回默認值 0
  • System.out.println
    • 輸出計算結果。

示例運行

輸入 1
3 5
1 2 3 4 5
  • 輸出
    7
    
  • 解釋
    • m = 3(3 臺機器),n = 5(5 個任務)。
    • 任務時間數組為 [1, 2, 3, 4, 5]
    • 分配結果:
      • 機器 0:1 + 4 = 5
      • 機器 1:2 + 5 = 7
      • 機器 2:3 = 3
    • 最大負載為 7
輸入 2
2 4
3 1 7 2
  • 輸出
    8
    
  • 解釋
    • m = 2(2 臺機器),n = 4(4 個任務)。
    • 任務時間數組為 [1, 2, 3, 7](排序后)。
    • 分配結果:
      • 機器 0:1 + 7 = 8
      • 機器 1:2 + 3 = 5
    • 最大負載為 8

總結

  • 該代碼通過輪詢分配的方式,將任務分配給負載最小的機器。
  • 使用 Arrays.sort 對任務執行時間進行排序,確保任務按時間從小到大分配。
  • 使用流操作計算數組中的最大值,簡化代碼邏輯。
  • 如果有其他問題,歡迎繼續提問!

四、Python算法源碼

以下是 Python 代碼 的詳細中文注釋和講解:


Python 代碼

# 輸入獲取
m, n = map(int, input().split())  # 讀取機器數量 m 和任務數量 n
times = list(map(int, input().split()))  # 讀取每個任務的執行時間并存入列表 times# 算法入口
def getResult():times.sort()  # 對任務執行時間列表進行升序排序mArr = [0] * m  # 定義列表 mArr,用于記錄每臺機器的總負載,初始值為 0for i in range(len(times)):  # 遍歷任務執行時間列表mArr[i % m] += times[i]  # 將任務分配給當前負載最小的機器(輪詢分配)return max(mArr)  # 返回 mArr 列表中的最大值(最大負載)# 算法調用
print(getResult())  # 調用 getResult 方法計算結果并輸出

代碼講解

1. 輸入部分
  • input().split()
    • 使用 input().split() 讀取一行輸入,并按空格分割成多個字符串。
  • map(int, ...)
    • 將分割后的字符串轉換為整數。
  • m, n
    • 分別表示機器數量 m 和任務數量 n
  • times 列表
    • 用于存儲每個任務的執行時間。
2. 數據處理部分
  • 排序
    • 使用 times.sort()times 列表進行升序排序,確保任務按執行時間從小到大分配。
  • 任務分配
    • 定義列表 mArr,用于記錄每臺機器的總負載,初始值為 0
    • 使用循環將任務分配給當前負載最小的機器(通過 i % m 實現輪詢分配)。
3. 輸出部分
  • max(mArr)
    • 計算 mArr 列表中的最大值(即所有機器中最大的負載)。
  • print(getResult())
    • 調用 getResult 方法計算結果并輸出。

示例運行

輸入 1
3 5
1 2 3 4 5
  • 輸出
    7
    
  • 解釋
    • m = 3(3 臺機器),n = 5(5 個任務)。
    • 任務時間列表為 [1, 2, 3, 4, 5]
    • 分配結果:
      • 機器 0:1 + 4 = 5
      • 機器 1:2 + 5 = 7
      • 機器 2:3 = 3
    • 最大負載為 7
輸入 2
2 4
3 1 7 2
  • 輸出
    8
    
  • 解釋
    • m = 2(2 臺機器),n = 4(4 個任務)。
    • 任務時間列表為 [1, 2, 3, 7](排序后)。
    • 分配結果:
      • 機器 0:1 + 7 = 8
      • 機器 1:2 + 3 = 5
    • 最大負載為 8

總結

  • 該代碼通過輪詢分配的方式,將任務分配給負載最小的機器。
  • 使用 sort() 對任務執行時間進行排序,確保任務按時間從小到大分配。
  • 使用 max() 計算列表中的最大值,簡化代碼邏輯。
  • 如果有其他問題,歡迎繼續提問!

五、C/C++算法源碼:

以下是 C 語言代碼C++ 代碼 的詳細中文注釋和講解:


C 語言代碼

#include <stdio.h>
#include <stdlib.h>#define MAX(a, b) ((a) > (b) ? (a) : (b)) // 定義宏 MAX,用于比較兩個數的大小// 比較函數,用于 qsort 排序
int cmp(const void* a, const void* b) {return (*(int*)a) - (*(int*)b); // 升序排序
}int main() {int m, n;scanf("%d %d", &m, &n); // 讀取機器數量 m 和任務數量 nint times[n]; // 定義數組 times,用于存儲每個任務的執行時間for (int i = 0; i < n; i++) {scanf("%d", &times[i]); // 讀取每個任務的執行時間并存入 times 數組}qsort(times, n, sizeof(int), cmp); // 對任務執行時間數組進行升序排序int* mArr = (int*)calloc(m, sizeof(int)); // 動態分配數組 mArr,用于記錄每臺機器的總負載,初始值為 0for (int i = 0; i < n; i++) {mArr[i % m] += times[i]; // 將任務分配給當前負載最小的機器(輪詢分配)}int ans = mArr[0]; // 初始化最大負載為 mArr[0]for (int i = 1; i < m; i++) {ans = MAX(ans, mArr[i]); // 遍歷 mArr,找到最大值}printf("%d\n", ans); // 輸出最大負載free(mArr); // 釋放動態分配的內存return 0;
}

C++ 代碼

#include <iostream>
#include <vector>
#include <algorithm> // 包含 sort 函數using namespace std;int main() {int m, n;cin >> m >> n; // 讀取機器數量 m 和任務數量 nvector<int> times(n); // 定義 vector times,用于存儲每個任務的執行時間for (int i = 0; i < n; i++) {cin >> times[i]; // 讀取每個任務的執行時間并存入 times 數組}sort(times.begin(), times.end()); // 對任務執行時間數組進行升序排序vector<int> mArr(m, 0); // 定義 vector mArr,用于記錄每臺機器的總負載,初始值為 0for (int i = 0; i < n; i++) {mArr[i % m] += times[i]; // 將任務分配給當前負載最小的機器(輪詢分配)}int ans = *max_element(mArr.begin(), mArr.end()); // 使用 max_element 找到 mArr 中的最大值cout << ans << endl; // 輸出最大負載return 0;
}

代碼講解

1. 輸入部分
  • C 語言
    • 使用 scanf 讀取機器數量 m 和任務數量 n
    • 使用循環讀取每個任務的執行時間并存入 times 數組。
  • C++
    • 使用 cin 讀取機器數量 m 和任務數量 n
    • 使用 vector 存儲任務執行時間,并通過循環讀取輸入。
2. 數據處理部分
  • 排序
    • C 語言:使用 qsorttimes 數組進行升序排序。
    • C++:使用 sorttimes 數組進行升序排序。
  • 任務分配
    • C 語言:動態分配數組 mArr,用于記錄每臺機器的總負載,并通過循環將任務分配給當前負載最小的機器。
    • C++:使用 vector 存儲每臺機器的總負載,并通過循環將任務分配給當前負載最小的機器。
3. 輸出部分
  • C 語言
    • 使用循環遍歷 mArr,找到最大值并輸出。
    • 使用 free 釋放動態分配的內存。
  • C++
    • 使用 max_element 找到 mArr 中的最大值并輸出。

示例運行

輸入 1
3 5
1 2 3 4 5
  • 輸出
    7
    
  • 解釋
    • m = 3(3 臺機器),n = 5(5 個任務)。
    • 任務時間數組為 [1, 2, 3, 4, 5]
    • 分配結果:
      • 機器 0:1 + 4 = 5
      • 機器 1:2 + 5 = 7
      • 機器 2:3 = 3
    • 最大負載為 7
輸入 2
2 4
3 1 7 2
  • 輸出
    8
    
  • 解釋
    • m = 2(2 臺機器),n = 4(4 個任務)。
    • 任務時間數組為 [1, 2, 3, 7](排序后)。
    • 分配結果:
      • 機器 0:1 + 7 = 8
      • 機器 1:2 + 3 = 5
    • 最大負載為 8

總結

  • C 語言
    • 使用 qsort 進行排序,動態分配內存,手動遍歷數組找到最大值。
  • C++
    • 使用 vectorsort 簡化代碼,使用 max_element 找到最大值。
  • 如果有其他問題,歡迎繼續提問!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66292.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

opencv圖像基礎學習

2.3圖像的加密解密 源碼如下&#xff1a; import cv2 import numpy as np import matplotlib.pyplot as plt def passImg():imgcv2.imread(./image/cat.jpg,0)h,wimg.shape#生成一個密碼&#xff0c;加密key_imgnp.random.randint(0,256,size(h,w),dtypenp.uint8)img_addmcv2…

【機器學習】零售行業的智慧升級:機器學習驅動的精準營銷與庫存管理

我的個人主頁 我的領域&#xff1a;人工智能篇&#xff0c;希望能幫助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;點贊 收藏? 在當今數字化浪潮洶涌澎湃的時代&#xff0c;零售行業正站在轉型升級的十字路口。市場競爭的白熱化使得企業必須另辟蹊徑&#xff0…

Navicat Premium 原生支持阿里云 PolarDB 數據庫

近日&#xff0c;我司旗下的 Navicat Premium 軟件通過了阿里云 PolarDB 數據庫產品生態集成認證&#xff0c;這標志著 Navicat 通過原生技術全面實現了對秒級彈性、高性價比、穩定可靠的PolarDB 數據庫三大引擎&#xff08;PolarDB MySQL版、PolarDB PostgreSQL版和 PolarDB f…

【SpringBoot應用篇】SpringBoot+MDC+自定義Filter操作traceId實現日志鏈路追蹤

【SpringBoot應用篇】SpringBootMDC自定義Filter操作traceId實現日志鏈路追蹤 解決的問題解決方案MDC具體邏輯ymllogback-spring.xmlTraceIdUtil操作工具類TraceIdFilter自定義過濾器GlobalExceptionHandler全局異常處理類TraceIdAspect切面UserController測試驗證 多線程處理M…

python如何解析word文件格式(.docx)

python如何解析word文件格式&#xff08;.docx&#xff09; .docx文件遵從開源的“Office Open XML標準”&#xff0c;這意味著我們能用python的文本操作對它進行操作&#xff08;實際上PPT和Excel也是&#xff09;。而且這并不是重復造輪子&#xff0c;因為市面上操作.docx的…

android wifi framework與wpa_supplicant的交互

android frmework直接與wpa_supplicant進行交互&#xff0c;使用aidl或者hidl 二、事件 framework注冊事件的地方&#xff1a; packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java class SupplicantStaIfaceCallbackImpl exte…

python爬蟲報錯日記

python爬蟲報錯日記 類未定義 原因&#xff1a;代碼檢查沒有問題**&#xff0c;位置錯了**&#xff0c;測試代碼包含在類里…… UnicodedecodeError錯誤 原因&#xff1a;字符沒有自動轉換成utf-8格式 KeyError&#xff1a;“href” 原因&#xff1a;前面運行正常&#x…

[ Spring ] Install Nacos on Ubuntu24

文章目錄 Download Nacos Package and UnzipConfigure NacosConfigure JAVA_HOME for Bash FileConfigure Default User and PasswordStartup NacosVisit Admin Webpage Download Nacos Package and Unzip https://github.com/alibaba/nacos/releases/download/3.0.0-alpha/na…

Swift語言的多線程編程

Swift語言的多線程編程 在現代軟件開發中&#xff0c;多線程編程是提高應用性能和響應速度的重要手段。尤其是在 iOS 和 macOS 開發中&#xff0c;由于用戶界面(UI)的交互性和復雜性&#xff0c;合理利用多線程可以極大地提升用戶體驗。本文將深入探討 Swift 語言中的多線程編…

第34天:Web開發-PHP應用鑒別修復AI算法流量檢測PHP.INI通用過濾內置函數

#知識點 1、安全開發-原生PHP-PHP.INI安全 2、安全開發-原生PHP-全局文件&單函數 3、安全開發-原生PHP-流量檢測&AI算法 一、通用-PHP.INI設置 參考&#xff1a; https://www.yisu.com/ask/28100386.html https://blog.csdn.net/u014265398/article/details/109700309 …

機器學習之決策樹(DecisionTree)

決策樹中選擇哪一個特征進行分裂&#xff0c;稱之為特征選擇。 特征選擇是找出某一個特征使得分裂后兩邊的樣本都有最好的“歸宿”&#xff0c;即左邊分支的樣本屬于一個類別、右邊分支的樣本屬于另外一個類別&#xff0c;左邊和右邊分支包含的樣本盡可能分屬同一類別&#xff…

進階——十六屆藍橋杯嵌入式熟練度練習(按鍵+LCD)

高亮&#xff08;一&#xff09; 聲明 char buf[21];unsigned char upled0x04;uint8_t key_val;uint8_t key_down,key_up,key_old;uint32_t key_time;uint8_t key_temp,key_flag;uint8_t line_flag; 按鍵代碼 void key_proc(void) { key_valkey_scan();key_downkey_val&…

基于PHP的校園新聞發布管理

摘要 近年來&#xff0c;隨著互聯網技術的迅速發展&#xff0c;人們獲取新聞的渠道也變得越來越多樣化&#xff0c;已經不再拘束于傳統的報紙、期刊、雜志等紙質化的方式&#xff0c;而是通過網絡滿足了人們獲得第一手新聞的愿望&#xff0c;這樣更加有助于實現新聞的規范化管…

MySQL程序之:使用DNS SRV記錄連接到服務器

在域名系統&#xff08;DNS&#xff09;中&#xff0c;SRV記錄&#xff08;服務位置記錄&#xff09;是一種資源記錄&#xff0c;它使客戶端能夠指定指示服務、協議和領域的名稱。DNS查找該名稱會返回一個回復&#xff0c;其中包含該領域中提供所需服務的多個可用服務器的名稱。…

代碼合并沖突解決push不上去的問題

環境&#xff1a;【IntelliJ IDEA】 【Gerrit】 1、錯誤信息 代碼合并&#xff0c;迭代1合并到迭代2&#xff0c;解決沖突后&#xff0c;依然push不上去&#xff0c;報錯信息如下&#xff1a; remote: Processing changes: refs: 1 remote: Processing changes: refs…

opencv projectPoints函數 computeCorrespondEpilines函數 undistortPoints函數

opencv projectPoints函數 cv::projectPoints 是 OpenCV 中用于將三維點投影到二維圖像平面的函數。它通常用于計算在相機坐標系下的三維點在圖像坐標系中的位置&#xff0c;考慮了相機的內參和外參。 函數原型 void cv::projectPoints(InputArray objectPoints,InputArray …

從玩具到工業控制--51單片機的跨界傳奇【3】

在科技的浩瀚宇宙中&#xff0c;51 單片機就像一顆獨特的星辰&#xff0c;散發著神秘而迷人的光芒。對于無數電子愛好者而言&#xff0c;點亮 51 單片機上的第一顆 LED 燈&#xff0c;不僅僅是一次簡單的操作&#xff0c;更像是開啟了一扇通往新世界的大門。這小小的 LED 燈&am…

boss直聘 __zp_stoken__ 逆向分析

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 有相關問題請第一時間頭像私信聯系我刪…

【日志篇】(7.6) ? 01. 在macOS下刷新FortiAnalyzer固件 ? FortiAnalyzer 日志分析

【簡介】FortiAnalyzer 是 Fortinet Security Fabric 安全架構的基礎&#xff0c;提供集中日志記錄和分析&#xff0c;以及端到端可見性。因此&#xff0c;分析師可以更有效地管理安全狀態&#xff0c;將安全流程自動化&#xff0c;并快速響應威脅。具有分析和自動化功能的集成…

Linux 內核自旋鎖spinlock(一)

文章目錄 前言一、自旋鎖1.1 簡介1.2 API1.2.1 spin_lock/spin_unlock1.2.2 spin_lock_irq/spin_unlock_irq1.2.3 spin_lock_irqsave/spin_unlock_irqstore1.2.4 spin_lock_bh/spin_unlock_bh1.2.5 補充 二、自選鎖原理三、自旋鎖在內核的使用3.1 struct file3.2 struct dentry…