WeHelp是台灣的軟體工程師社群,它的網站有程式解題系統 WeHelp Coding,提供基礎的程式練習題,適合新手熟悉語法、建立寫程式的邏輯思維。網站不會保留使用者的作答結果,因此我在這裡留下自己的解答,以及參考AI後修改的解法。目前系統提供Python和JavaScript兩種程式語言解題,本文用JavaScript解題,附上題目和註解供大家參考。
11. 找到目標數字所在的索引位置
輸入一個整數陣列 / 列表和要找的目標數字,你的函式能找到並回傳目標數字所在的索引位置。若該數字不存在於陣列 / 列表中,回傳 -1;若該數字重複出現多次,以第一個出現的位置為準。
輸入範例:[3, 2, 1, 5, 10]、目標數字 1。回傳:2
輸入範例:[5, 2, 3]、目標數字 4。回傳:-1
輸入範例:[-5, 2, -5, 1, 3],目標數字 -5。回傳:0
// @param nums:{[Integer]}
// @param target:{Integer}
// @return :{Integer}
function findIndex(nums, target){
for (let i=0; i<nums.length; i++){
if (nums[i]==target) return i;
}
return -1
}
12. 找到目標數字所在的多個索引位置
輸入一個整數陣列 / 列表和要找的目標數字,你的函式能找到並回傳目標數字所在的零到多個索引位置。回傳包含多個索引位置的陣列 / 列表,由小到大排列,若目標數字不存在於陣列 / 列表中,回傳空陣列 / 空列表。
輸入範例:[3, 2, 1, 5, 10]、目標數字 1。回傳:[2]
輸入範例:[5, 2, 3]、目標數字 4。回傳:[]
輸入範例:[-5, 2, -5, 1, -5],目標數字 -5。回傳:[0, 2, 4]
// @param nums:{[Integer]}
// @param target:{Integer}
// @return :{[Integer]}
function findIndexes(nums, target){
let indexArray = [];
for (let i=0; i<nums.length; i++){
if (nums[i] == target)
indexArray.push(i);
}
return indexArray;
}
13. 翻轉一個字串
輸入一個字串,你的函式能夠翻轉這個字串。
輸入範例:Hello。回傳:olleH
輸入範例:abcd。回傳:dcba
輸入範例:Good Job。回傳:boJ dooG
// @param s:{String}
// @return :{String}
// 迴圈
function reverseString(s){
let string = "";
for (let i=s.length-1; i>=0; i--){
string += s[i];
}
return string;
}
// 內建方法 切開、反轉、合併
function reverseString(s){
return s.split("").reverse().join("");
}
14. 整數陣列 / 列表中,兩兩相乘的最大值
輸入一個至少包含兩個整數的陣列 / 列表,其中可能包含重複的數字if,你的函式能算出並回傳兩兩數字相乘後最大的乘積。
輸入範例:[2, -1, 0]。回傳:0
輸入範例:[-2, -10, 1, 2]。回傳:20
輸入範例:[3, 1, 9, 4, 5]。回傳:45
// @param nums:{[Integer]}
// @return :{Integer}
// 雙層迴圈沒效率
function findMaxProduct(nums){
let max = nums[0]*nums[1];
let length = nums.length;
for (let i=0; i<length; i++){
for (let j=0; j<length; j++){
if (i!=j && nums[i]*nums[j] > max)
max = nums[i]*nums[j];
}
}
return max;
}
// 先把數字排序再取兩個數相乘,負數相乘會變正數所以最大最小兩邊都要檢驗
function findMaxProduct(nums){
const sorted = nums.sort((a,b) => a-b); // .sort()是字典排序所以要加排序邏輯
const head = sorted[0]*sorted[1];
const tail = sorted[sorted.length-1]*sorted[sorted.length-2];
return head > tail ? head : tail;
}
15. 檢查輸入的密碼是否合乎規範
輸入一個字串代表密碼,你的函式能檢查輸入的字串是否合乎以下規範:
- 只能包含大小寫英文字母、數字、以及以下特殊符號 ! @ # $ %
- 至少要包含一個大寫和一個小寫字母
- 至少要包含一個數字
- 至少要包含一個特殊符號
- 必須大於等於 8 個字元、小於等於 16 個字元。
若輸入的密碼符合規範,回傳真值,不符合規範,則回傳假值。
輸入範例:abcD。回傳:假
輸入範例:aBcdefg8$。回傳:真
輸入範例:12345678。回傳:假
// @param s:{String}
// @return :{Boolean}
// 用test方法檢測是否符合正則表達式
function checkPassword(s){
if (!/^[a-zA-Z0-9!@#$%]+$/.test(s)) return false;
if (!/[A-Z]/.test(s)) return false;
if (!/[a-z]/.test(s)) return false;
if (!/\d/.test(s)) return false;
if (!/[!@#$%]/.test(s)) return false;
if (s.length <8 || s.length>16) return false;
return true;
}
// Gemini推薦
function checkPassword(s) {
const regex=/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%])[a-zA-Z0-9!@#$%]{8,16}$/;
if (!regex.test(s)) return false;
return true;
}
16. 偶數測試
輸入一個整數,若輸入的整數是偶數,回傳真;否則,回傳假。
輸入範例:0。回傳:真
輸入範例:-7。回傳:假
輸入範例:102。回傳:真
// @param n:{Integer}
// @return :{Boolean}
function checkEven(n){
if (n%2==0) return true;
else return false;
}
// 使用條件運算子讓程式更簡潔
function checkEven(n){
return n%2==0 ? true : false;
}
17. 質數測試
輸入一個正整數,若輸入的正整數是質數,回傳真;否則,回傳假。質數定義:在大於 1 的正整數中,除了 1 和該數自身外,無法被其他正整數整除的數。1 本身非質數。
輸入範例:1。回傳:假
輸入範例:2。回傳:真
輸入範例:75。回傳:假
// @param n:{Integer}
// @return :{Boolean}
// 先特別處理1,2,2N 讓迴圈少跑一點
// 接著用迴圈除以每一個奇數。多數人會驗證到n為止,其實到根號n就足已確認
function checkPrime(n){
if (n==1) return false;
if (n==2) return true;
if (n%2==0) return false;
for (let i=3; i*i <= n; i+=2){
if (n%i==0) return false;
}
return true;
}
18. 將數字用固定小數位數的格式輸出
輸入一個數字,可能是整數或浮點數,你的函式必須將這個數字轉換為固定顯示 2 個小數位數的字串格式。若輸入的數字超過 2 個小數位數,則以四捨五入處理。
輸入範例:0。回傳:0.00
輸入範例:5.4658。回傳:5.47
輸入範例:-3.123。回傳:-3.12
輸入範例:100.1。回傳:100.10
// @param n:{Number}
// @return :{String}
// 內建方法
function formatFloat(n){
return n.toFixed(2);
}
19. 計算有幾個英文單字
輸入一個只包含英文字和空白的字串,你的函式能找出這個字串中有幾個英文單字。不考慮英文單字是否真的存在,且假設英文單字間用一個空白隔開,字串的前後有可能包含零到多個空白。
輸入範例:"Today is a good day"。回傳:5
輸入範例:" My name is John"。回傳:4
輸入範例:" Good "。回傳:1
輸入範例:" "。回傳:0
// @param s:{String}
// @return :{Integer}
function countWords(s){
let count=0;
const string = s.trim(); //去除頭尾空白
if (/[a-zA-Z]+/.test(string)){ //如果有英文字從1開始算
count=1;
for (let i=0; i<string.length; i++){
if (string[i]==" ") count ++;
}
}
return count;
}
//參考Gemini
function countWords(s){
if (s.trim() == "") return 0;
let words = s.trim().split(" "); //用空格分割 回傳陣列
return words.length;
}
20. 檢查是否為等差數列
輸入包含至少三個整數的陣列 / 列表,你的函式能判斷其中的整數是否形成一個等差數列。若是,回傳真,若否,回傳假。
輸入範例:[3, 2, 1]。回傳:真
輸入範例:[0, 0, 0, 0]。回傳:真
輸入範例:[-17, -13, -9, -5]。回傳:真
輸入範例:[1, 3, 6]。回傳:假
// @param nums:{[Integer]}
// @return :{Boolean}
function checkArithmeticSequence(nums){
let diff = nums[1]-nums[0];
for (let i=2; i<nums.length; i++){
if (nums[i]-nums[i-1] != diff)
return false;
}
return true;
}