WeHelp是台灣的軟體工程師社群,它的網站有程式解題系統 WeHelp Coding,提供基礎的程式練習題,適合新手熟悉語法、建立寫程式的邏輯思維。網站不會保留使用者的作答結果,因此我在這裡留下自己的解答,以及參考AI後修改的解法。目前系統提供Python和JavaScript兩種程式語言解題,本文用JavaScript解題,附上題目和註解供大家參考。
31. 交換資料的位置
輸入一個包含兩個整數的陣列 / 列表,將其中的兩個整數互相交換位置,回傳交換後的陣列 / 列表。
輸入範例:[2, 4]。回傳:[4, 2]
輸入範例:[1, -5]。回傳:[-5, 1]
輸入範例:[0, 100]。回傳:[100, 0]
// @param ns:{[Integer]}
// @return :{[Integer]}
function exchange(ns){
return [ns[1],ns[0]];
}
32. 基礎四則運算
輸入兩個整數,以及一個字串代表要做的運算是加、減、乘、除中的哪一個,計算並回傳運算的結果。輸入的字串可能是 + - * / 的其中一個符號,分別代表加、減、乘、除的運算。其中除法的結果,使用無條件捨去取整數。
輸入範例:3、2、"+"。回傳:5
輸入範例:10、3、"/"。回傳:3
輸入範例:-6、8、"/"。回傳:-1
輸入範例:-5、2、"*"。回傳:-10
// @param n1:{Integer}
// @param n2:{Integer}
// @param op:{String}
// @return :{Integer}
function calculate(n1, n2, op){
switch (op){
case "+":
return n1+n2;
case "-":
return n1-n2;
case "*":
return n1*n2;
case "/":
return Math.floor(n1/n2);
}
}
33. 計算 X 的 Y 次方
輸入兩個整數 X 和 Y,計算並回傳 X 的 Y 次方計算結果。
其中 X 介於 -30 ~ 30 之間,Y 介於 0 ~ 10 之間。
輸入範例:3、4。回傳:81
輸入範例:-5、0。回傳:1
輸入範例:-10、3。回傳:-1000
// @param x:{Integer}
// @param y:{Integer}
// @return :{Integer}
// 運算子
function power(x, y){
return x**y;
}
// Math方法
function power(x, y){
return Math.pow(x,y);
}
// 用迴圈
function power(x, y){
if (y==0) return 1;
if (y==1) return x;
let ans = x;
for (let i=2; i<=y; i++){
ans = ans*x
}
return ans;
}
34. 計算百分比
輸入兩個非負整數,第一個代表完成的工作項目數量,第二個代表總共有多少工作項目。你的函式能計算出工作項目的完成率,並且用百分比的字串格式輸出,無條件捨去到整數的部份。
輸入範例:0、20。回傳:"0%"
輸入範例:21、40。回傳:"52%"
輸入範例:3、11。回傳:"27%"
輸入範例:60、60。回傳:"100%"
// @param completed:{Integer}
// @param total:{Integer}
// @return :{String}
function toPercentage(completed, total){
return Math.floor(completed/total*100)+"%";
}
35. 班級成績的及格率
輸入一個整數陣列 / 列表,代表一個班級中所有學生的數學成績,其中成績為 0 ~ 100 之間的整數,且大於等於 60 分為及格。你的函式能計算並回傳班級成績的及格率,使用百分比的字串格式輸出,無條件捨去到整數的部份。
輸入範例:[70, 0, 33, 60, 2, 59]。回傳:"33%"
輸入範例:[65, 77, 81, 100]。回傳:"100%"
輸入範例:[51, 40, 10]。回傳:"0%"
// @param grades:{[Integer]}
// @return :{String}
// forEach解法
function getPassRate(grades){
let pass = 0;
grades.forEach (g => { if (g>=60) pass++ });
return Math.floor(pass/grades.length*100)+"%";
}
// reduce解法
function getPassRate(grades){
const pass = grades.reduce((acc,g) =>
g>=60 ? acc++ : acc, 0);
return Math.floor(pass/grades.length*100)+"%";
}
36. 找出不一樣的資料
輸入一個至少有三筆資料的整數陣列 / 列表,其中包含唯一一個和其他所有資料不同的整數。你的函式能找出並回傳這個整數所在的索引位置。
輸入範例:[5, 5, 0]。回傳:2
輸入範例:[1, 2, 1, 1, 1]。回傳:1
輸入範例:[-5, 8, 8, 8]。回傳:0
// @param ns:{[Integer]}
// @return :{Integer}
function findUnique(ns){
// 若前兩個數字不同表示答案就在其中
if (ns[0] != ns[1]){
return ns[0] == ns[2] ? 1 : 0;
}// 前兩個相同就開始往後找
for (let i=2; i<ns.length; i++){
if (ns[i]!=ns[0]) return i;
}
}
37. 找出眾數
輸入一個非負整數陣列 / 列表,其中包含的非負整數在 0 ~ 20 之間,找出並回傳其中的眾數:即出現次數最多的整數值。你可以假設不會同時有多個眾數出現。
輸入範例:[1, 2, 1, 3, 1]。回傳:1
輸入範例:[6, 0, 8, 8, 10]。回傳:8
輸入範例:[0, 2, 0, 1, 1, 20, 0]。回傳:0
// @param ns:{[Integer]}
// @return :{Integer}
// 做一個物件來存每個數字的次數 再尋找其中的最大值
function findMode(ns){
const counts = {};
let maxCount=0, maxKey;
for (let i=0; i<ns.length; i++){
let nowKey = ns[i];
counts[nowKey] = (counts[nowKey] || 0) +1;
if (counts[nowKey] > maxCount){
maxCount = counts[nowKey];
maxKey = nowKey;
}
}
return +maxKey; // key是文字要轉為數字
}
// 以下是原本的作法 要跑三次迴圈太沒效率
function findMode(ns){
const counts = {};
for (let i=0; i<ns.length; i++){
counts[ns[i]] == null ? counts[ns[i]] =1 : counts[ns[i]]++;
}
const maxValue = Math.max(...Object.values(counts));
for (let[k,v] of Object.entries(counts)){
if (v == maxValue) return +k;
}
}
38. 檢查是否為迴文
輸入一個包含英數字的字串,你的函式能夠檢查這個字串是否為一個「迴文」,若是,回傳真;否則,回傳假。迴文:從中間切開,左右兩邊對稱的字串。
輸入範例:"abccba"。回傳:真
輸入範例:""。回傳:真
輸入範例:"aba"。回傳:真
輸入範例:"aaaccc"。回傳:假
// @param s:{String}
// @return :{Boolean}
function checkPalindrome(s){
for (let i=0; i < (s.length)/2 ; i++){
if (s[i] != s[s.length-1-i]) return false;
}
return true;
}
39. 去除重複的資料
輸入一個整數陣列 / 列表,其中包含的整數在 -20 ~ 20 之間,你的函式能夠去除重複出現的整數,只保留最前面 ( 最小索引 ) 的資料,回傳去除重複資料後的陣列 / 列表。
輸入範例:[3, 2, -6, 2, 3, 5, 2]。回傳:[3, 2, -6, 5]
輸入範例:[0, 0, 0, 0]。回傳:[0]
輸入範例:[1, -3, -5, 2, -5, 1]。回傳:[1, -3, -5, 2]
// @param ns:{[Integer]}
// @return :{[Integer]}
// Set物件的資料不能重複 也就是會自動過濾不重複的資料
function removeDuplicates(ns){
const set = new Set();
for (let i=0; i<ns.length; i++){
set.add(ns[i])
}
return Array.from(set);
}
// 最簡潔的寫法 Set建構子可以放array
function removeDuplicates(ns){
return [...new Set(ns)];
}
40. 檢查方形是否有重疊的部份
輸入兩個陣列 / 列表代表兩個平面座標上的方形區塊,格式為 [x, y, w, h],其中 x 和 y 為整數,代表方形區塊左上角的座標點;w 和 h 為正整數,代表往右下方延伸的寬度和高度。
你的函式能判斷兩個方形區塊是否有重疊的部份,若有,回傳真;否則,回傳假。其中,邊線剛好碰到的情況也算是重疊。
平面座標定義:X 軸往右是正數、往左是負數;Y 軸往上是正數、往下是負數。
輸入範例:方形一:[0, 0, 10, 10] 方形二:[-5, 5, 5, 5]。回傳:真
輸入範例:方形一:[10, 0, 10, 5] 方形二:[30, 5, 10, 5]。回傳:假
輸入範例:方形一:[-5, -5, 20, 10] 方形二:[0, -10, 5, 5]。回傳:真
// @param rect1:{[Integer]}
// @param rect2:{[Integer]}
// @return :{Boolean}
// 此圖邏輯與27題相同 區間重疊表示任一數列的上限>=另一數列的下限
// 若題目敘述太抽象 一定要畫圖理解再寫
function isOverlapping(rect1, rect2){
const [x1,y1,w1,h1] = rect1;
const [x2,y2,w2,h2] = rect2;
if (x1+w1>=x2 && x2+w2>=x1 && y1-h1<=y2 && y2-h2<=y1){
return true;
}
return false;
}