WeHelp是台灣的軟體工程師社群,它的網站有程式解題系統 WeHelp Coding,提供基礎的程式練習題,適合新手熟悉語法、建立寫程式的邏輯思維。網站不會保留使用者的作答結果,因此我在這裡留下自己的解答,以及參考AI後修改的解法。目前系統提供Python和JavaScript兩種程式語言解題,本文用JavaScript解題,附上題目和註解供大家參考。
41. 計算兩個區間的重疊區域
輸入兩個陣列 / 列表,分別代表兩個整數區間的最小值和最大值 [min1, max1] 和 [min2, max2],你的函式能計算並回傳兩個整數區間的重疊區域範圍,重疊區域包含最小或最大值落在同一個整數的狀況,回傳的重疊區域格式為 [min, max]。
可以假設每個區間的最大值一定大於最小值。若兩個區間沒有重疊,回傳空陣列 / 列表。輸入範例:[5, 10],[9, 11]。回傳:[9, 10]
輸入範例:[-5, 5],[8, 10]。回傳:[]
輸入範例:[-5, 5],[-6, -5]。回傳:[-5, -5]
// @param range1:{[Integer]}
// @param range2:{[Integer]}
// @return :{[Integer]}
// 此題邏輯與40題相似 任一個最大值必須>=另一個最小值
function getOverlappingRange(range1, range2){
const [min1, max1] = range1;
const [min2, max2] = range2;
if (!(max1>=min2 && max2>=min1)) return [];
const maxR = max1 < max2 ? max1 : max2;
const minR = min1 > min2 ? min1 : min2;
return [minR, maxR];
}
42. 蛇形命名轉換為大駝峰命名
輸入一個包含小寫英數字和底線的字串,代表程式語言中常見的蛇形命名法,你的函式能將此字串轉換為另外一種常見的大駝峰命名法。
蛇形命名法:用底線隔開多個全小寫的英文單字。
大駝峰命名法:多個英文單字的第一個字母皆大寫。
輸入範例:"test"。回傳:"Test"
輸入範例:"hello_world"。回傳:"HelloWorld"
輸入範例:"get_weather_data"。回傳:"GetWeatherData"
// @param name:{String}
// @return :{String}
// Gemini建議
function snakeToUpperCamel(name) {
if (!name) return ""; // 處理空字串的情況
const words = name.split('_');
return words
.map(word => word[0].toUpperCase() + word.slice(1))
.join('');
}
// 如果遇到_就把下一個字轉大寫 否則就原樣
function snakeToUpperCamel(name){
let camel = "";
if (name.length>0)
camel = name[0].toUpperCase();
for (let i=1; i<name.length; i++){
if (name[i] =="_"){
i++;
camel += name[i].toUpperCase();
}else{
camel += name[i];
}
}
return camel;
}
43. 大駝峰命名轉換為蛇形命名
輸入一個包含大小寫英數字的字串,代表程式語言中常見的大駝峰命名法,你的函式能將此字串轉換為另外一種常見、包含底線的蛇形命名法。
大駝峰命名法:多個英文單字的第一個字母皆大寫。
蛇形命名法:用底線隔開多個全小寫的英文單字。
輸入範例:"Test"。回傳:"test"
輸入範例:"HelloWorld"。回傳:"hello_world"
輸入範例:"GetWeatherData"。回傳:"get_weather_data"
// @param name:{String}
// @return :{String}
// Gemini建議把所有大寫字取代成_小寫字。regex ()表示群組 $1表示第1個群組
function upperCamelToSnake(name){
if (!name) return "";
return name.replaceAll(/([A-Z])/g,"_$1")
.toLowerCase().slice(1);
}
// split用正則表達式,()表示要分割器要保留
function upperCamelToSnake(name){
if (!name) return "";
const words = name.split(/([A-Z])/);
return words
.map(word=>{
if (/[A-Z]/.test(word)) return "_"+word.toLowerCase();
else return word;
})
.join("").slice(1);
}
44. 費式數列的第 N 個數
輸入一個非負整數 N,你的函式能取得費式數列中的第 N 個整數並回傳。費式數列定義如下:
- 第 0 個數 = 1
- 第 1 個數 = 1
- 第 N 個數 = 第 N-1 個數 + 第 N-2 個數
根據以上定義,得到 1、1、2、3、5、8、13、21、34、55 以此類推,即費式數列 ( Fibonacci Sequence )
輸入範例:0。回傳:1
輸入範例:4。回傳:5
輸入範例:9。回傳:55
注意事項:你必須實作一個時間複雜度為 O(N) 的演算法,否則將會因執行逾時而失敗。
// @param n:{Integer}
// @return :{Integer}
// 陣列解法最簡潔
function getFibNumber(n){
const fib = [1, 1];
for (let i=2; i<=n; i++){
fib[i] = fib[i-1] + fib[i-2];
}
return fib[n];
}
// 不寫陣列也可以
function getFibNumber(n){
if (n==0 || n==1) return 1;
let fa=1 , fb=1, fc;
for (let i=2; i<=n; i++){
fc = fa + fb;
fa = fb;
fb = fc;
}
return fc;
}
45. 關鍵字推薦
輸入一個包含小寫英文字母的字串陣列 / 列表,代表所有可能的潛在關鍵字;再輸入一個英文字串,代表目前的提示字。
你的函式能從所有潛在的關鍵字中,找到並回傳以目前提示字為前綴的所有關鍵字陣列 / 列表。須按照字母順序由小到大排列,但長度短的關鍵字要排前面。
輸入範例:["abc", "xyz", "zzz", "ac", "aa"]、"a"。回傳:["aa", "ac", "abc"]
輸入範例:["xyz", "ooo", "test", "cba"]、"k"。回傳:[]
輸入範例:["test", "zbz", "pply", "zbaa", "zxy"]、"zb"。回傳:["zbz", "zbaa"]
// @param candidates:{[String]}
// @param prompt:{String}
// @return :{[String]}
//
function suggestKeywords(candidates, prompt){
return candidates.filter(word =>word.startsWith(prompt))
.sort((a,b) => a > b ? 1:-1) // 字母排序
.sort((a,b) => a.length - b.length) //長度排序
}
// 特別注意在文字長度相同時 [長度相減]的結果不等於[條件運算]的結果
function suggestKeywords(candidates, prompt){
return candidates.filter(word =>word.startsWith(prompt))
.sort((a,b) => a > b ? 1:-1)
.sort((a,b) => a.length >= b.length ? 1 : -1)
}
46. 十二生肖查詢
輸入一個正整數表示西元年份,你的函式回傳該年份所屬的生肖動物名稱。請參考以下規則:已知西元 1912 年為「鼠」年,十二生肖依序為「鼠」、「牛」、「虎」、「兔」、「龍」、「蛇」、「馬」、「羊」、「猴」、「雞」、「狗」、「豬」。
輸入範例:1912。回傳:"鼠"
輸入範例:1946。回傳:"狗"
輸入範例:1855。回傳:"兔"
輸入範例:2024。回傳:"龍"
// @param year:{Integer}
// @return :{String}
function getChineseZodiac(year){
const zodiac =['鼠','牛','虎','兔','龍','蛇','馬','羊','猴','雞','狗','豬'];
return zodiac[(year+8)%12];
}
47. 計算包含幾個關鍵字
輸入一個包含大小寫英文字母的字串,再輸入一個關鍵字,你的函式能計算並回傳輸入字串中包含幾個關鍵字。計算時,不考慮字母的大小寫,且不重覆計算字母有重疊的關鍵字。
輸入範例:""、"ac"。回傳:0
輸入範例:"kKjaeAcxAC"、"ac"。回傳:2
輸入範例:"abababazz"、"Aba"。回傳:2
// @param text:{[String]}
// @param keyword:{String}
// @return :{Integer}
function countKeywords(text, keyword){
let split = text.toLowerCase().split(keyword.toLowerCase())
return split.length-1;
}
// "abababazz"用"Aba"切割會得到['', 'b', 'zz']
48. 產生對應的英文序數
每個數字,都有一個對應的英文序數表示法 ( Ordinal Numbers ),規則如下:
- 1 對應到 1st
- 2 對應到 2nd
- 3 對應到 3rd
- 4 對應到 4th
- 4 到 19 都可以在後面加上 th 表達序數
- 20 到 100 則以個位數的數字為準,個位數為 0 則使用 th
- 101 以上,則以後面兩位數為準,使用以上規則轉換,例如 101st、311th、1523rd。
你的函式接受一個小於 10000 的正整數輸入,用字串的形式,回傳對應的序數。
// @param number:{Integer}
// @return :{String}
function generateOrdinalNumber(number){
const ods = ['th','st','nd','rd'];
if (number%10 >= 4 || number%10 == 0) // 0,4-9結尾接th
return number+"th";
else if (number%100 >= 11 && number%100 <=13) //11-13結尾接th
return number+"th";
else return //其他查表
number+ods[number%10];
}