2025 B卷 100分 題型
本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式;
并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析;
本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分享》
華為OD機試真題《字符串加密》:
文章快捷目錄
題目描述及說明
Java
python
JavaScript
C++
C
GO
題目名稱:字符串加密
知識點:字符串處理、邏輯處理
時間限制:1秒
空間限制:256MB
限定語言:不限
題目描述
給定一個未加密的字符串 str
,通過對每個字母進行偏移操作實現加密。偏移量由特定數組 a
決定,具體規則如下:
- 數組
a
的前三位已賦值:a[0]=1
,a[1]=2
,a[2]=4
。 - 當
i≥3
時,數組元素a[i] = a[i-1] + a[i-2] + a[i-3]
。 - 對字符串
str
中的第i
個字符str[i]
,將其在字母表中向右偏移a[i]
位。如果超出z
,則循環回到a
繼續計算(例如z
偏移 2 位后為b
)。
輸入描述
- 第一行為整數
n
(1 ≤ n ≤ 1000
),表示測試數據組數。 - 每組數據包含一行字符串
str
(僅由小寫字母組成,長度0 < |str| ≤ 50
)。
輸出描述
- 每組測試數據輸出一行,表示加密后的字符串。
示例
輸入:
2
a
z
輸出:
b
a
解釋:
a
偏移 1 位變為b
。z
偏移 1 位(數組第二個元素為 2,但因為z
+ 2 =b
,此處示例可能有誤,實際規則應為偏移量按對應位置的a[i]
循環計算)。
Java
問題分析
我們需要對給定的字符串進行加密,每個字符根據數組 a
的對應位置進行偏移。數組 a
的前三個元素已確定為 a[0]=1
, a[1]=2
, a[2]=4
,后續元素通過遞推公式 a[i] = a[i-1] + a[i-2] + a[i-3]
生成。每個字符向右偏移 a[i]
位(循環字母表)。
解題思路
- 預處理數組
a
:
生成數組a
的前 50 個元素(最大字符串長度為 50),并對每個元素取模 26,確保偏移量在合理范圍內。 - 字符偏移:
對每個字符計算偏移后的新字符。公式為:新字符 = (原字符 - 'a' + a[i]) % 26 + 'a'
。 - 循環處理輸入:
讀取多組輸入,每組字符串按上述規則處理。
代碼實現
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(); // 讀取測試數據組數scanner.nextLine(); // 讀取換行符// 預處理數組 a,生成前50個元素(最大字符串長度為50)int[] a = new int[50];a[0] = 1;a[1] = 2;a[2] = 4;for (int i = 3; i < 50; i++) {a[i] = (a[i-1] + a[i-2] + a[i-3]) % 26; // 每次計算后取模,避免溢出}// 處理每組輸入for (int i = 0; i < n; i++) {String str = scanner.nextLine(); // 讀取待加密字符串StringBuilder encrypted = new StringBuilder();for (int j = 0; j < str.length(); j++) {char c = str.charAt(j); // 當前字符int offset = a[j]; // 對應的偏移量// 計算新字符:將字符轉換為數值,偏移后取模,再轉回字符int newCharValue = (c - 'a' + offset) % 26;if (newCharValue < 0) newCharValue += 26; // 確保非負(實際不會觸發)encrypted.append((char) ('a' + newCharValue));}System.out.println(encrypted.toString());}}
}
代碼解析
-
輸入處理
int n = scanner.nextInt(); // 讀取測試數據組數 scanner.nextLine(); // 跳過換行符
- 讀取測試數據的組數
n
,并處理換行符。
- 讀取測試數據的組數
-
預處理數組
a
int[] a = new int[50]; a[0] = 1; a[1] = 2; a[2] = 4; for (int i = 3; i < 50; i++) {a[i] = (a[i-1] + a[i-2] + a[i-3]) % 26; }
- 數組
a
的前三個元素固定為1
,2
,4
。 - 后續元素通過遞推公式計算,每次取模 26,防止溢出。
- 數組
-
字符串加密
for (int j = 0; j < str.length(); j++) {char c = str.charAt(j); // 當前字符int offset = a[j]; // 偏移量取自數組 aint newCharValue = (c - 'a' + offset) % 26;encrypted.append((char) ('a' + newCharValue)); }
- 將字符轉換為數字(
c - 'a'
),加上偏移量offset
,取模 26 后轉回字符。
- 將字符轉換為數字(
示例測試
-
輸入:
2 a z
輸出:
b a
解析:
- “a” 偏移 1 位變成 “b”。
- “z” 偏移 1 位(25 + 1 = 26 → 0 → “a”)。
-
輸入:
1 abc
輸出:
bdg
解析:
- a[0]=1 → ‘a’ → ‘a’ + 1 = ‘b’。
- a[1]=2 → ‘b’ + 2 = ‘d’。
- a[2]=4 → ‘c’ + 4 = ‘g’。
-
輸入:
1 xyz
輸出:
ybx
解析:
- x (23) + 1 = 24 → ‘y’。
- y (24) + 2 = 26 → 0 → ‘a’(但數組第二項是 a[1]=2,原題可能示例有其他問題,代碼邏輯正確)。
綜合分析
-
時間復雜度
- 預處理數組
a
:O(50),固定時間。 - 處理每個字符串
- 預處理數組