題目一 質數因子
功能:輸入一個正整數,按照從小到大的順序輸出它的所有質因子(重復的也要列舉)(如180的質因子為2 2 3 3 5 )
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {// Write your code herewhile ((line = await readline())) {let n = linelet factors = [];for (let i = 2; i <= n; i++) {while (n % i === 0) {factors.push(i);n /= i;}}console.log(factors.join(' '))}
})();
獲取到的新知識點(之前沒有注意過的寫法):
var a = 10;a *= 5;//等值:a=a*5console.log("a=" + a);a /= 5;//等值:a =a/5console.log("a=" + a);a %= 5;//等值:a=a%5console.log("a=" + a);
題目二 四舍五入
寫出一個程序,接受一個正浮點數值,輸出該數值的近似整數值。如果小數點后數值大于等于 0.5 ,向上取整;小于 0.5 ,則向下取整。
數據范圍:保證輸入的數字在 32 位浮點數范圍內
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void async function () {// Write your code herewhile(line = await readline()){console.log(Math.round(line))}
}()
考察對于Math庫的熟悉程度,下面是一些常用的Math方法和屬性
1、Math.PI
該屬性保存的是圓周率,可以快速的得到圓周率,從而用于計算圓的相關東西。
2、Math.ceil()
向上取整,只要是小數,就會變成比原來大的整數。
3、Math.floor()
向下取整,只要是小數,無論超過多少,都省略小數部分,變成比原來小的整數,和parseInt類似。
4、Math.round()
小數會進行四舍五入,但只看第一位小數。
5、Math.abs()
取絕對值。
6、Math.sqrt()
開方,只能得到算術平方根。
7、Math.pow(底數,指數)
乘方,按照指定的底數和指數算出結果。
8、Math.max(多個值)和Math.min(多個值)
找出多個值中的最大值和最小值。
9、Math.random()
產生0-1之間的隨機小數,但不包括1。
常用案例:0-10的隨機整數(包含10)
var res=Math.floor(Math.random()*(10+1))
console.log(res)
題目三 合并表記錄
數據表記錄包含表索引index和數值value(int范圍的正整數),請對表索引相同的記錄進行合并,即將相同索引的數值進行求和運算,輸出按照index值升序進行輸出。
輸入描述:
先輸入鍵值對的個數n(1 <= n <= 500)
接下來n行每行輸入成對的index和value值,以空格隔開
輸出描述:
輸出合并后的鍵值對(多行)
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {// Write your code herelet arr = [];while ((line = await readline())) {arr.push(line);}arr.shift(); let _obj = {}; // 空的對象arr.forEach((item) => {let _arr = item.split(" ");if (_obj[_arr[0]] != undefined) {_obj[_arr[0]] = Number(_arr[1]) + Number(_obj[_arr[0]]);} else {_obj[_arr[0]] = Number(_arr[1]);}});for(let key in _obj){console.log(key + " "+ _obj[key] )}
})();
主要思路:
① 首先存儲記錄,用shift()函數剔除鍵值對個數;
② 新建一個對象,將鍵值對的index作為屬性,value作為屬性的值,遍歷賦值;
③ for in 遍歷展示;
題目四 提取不重復的整數
描述
輸入一個 int 型整數,按照從右向左的閱讀順序,返回一個不含重復數字的新的整數。
保證輸入的整數最后一位不是 0 。
輸入描述:
輸入一個int型整數
輸出描述:
按照從右向左的閱讀順序,返回一個不含重復數字的新的整數
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void async function () {// Write your code herelet arr = []while(line = await readline()){arr = line.split('')}arr.reverse();arr = [...new Set(arr)];console.log(arr.join(''))
}()
思考:
思路就是,轉成數組,然后反轉,去重;
轉數組方法split(‘’)
數組反轉reverse()
去重[…new Set(arr)]
數組輸出arr.join(‘’)
題目五 字符串個數統計
編寫一個函數,計算字符串中含有的不同字符的個數。字符在 ASCII 碼范圍內( 0~127 ,包括 0 和 127 ),換行表示結束符,不算在字符里。不在范圍內的不作統計。多個相同的字符只計算一次
例如,對于字符串 abaca 而言,有 a、b、c 三種不同的字符,因此輸出 3 。
輸入描述:
輸入一行沒有空格的字符串。
輸出描述:
輸出 輸入字符串 中范圍在(0~127,包括0和127)字符的種數。
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void async function () {// Write your code herewhile(line = await readline()){let arr = line.split('');arr = [...new Set(arr)];console.log(arr.length)}
}()
思路就是:
split()轉成數組,然后去重[…new Set(arr)],輸出數組長度就是字符串的個數;
題目六 數字顛倒
字符串反轉
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void async function () {// Write your code herewhile(line = await readline()){console.log(line.split("").reverse().join(""))}
}()
核心代碼:
line.split("").reverse().join("")
題目七 字符串最后一個單詞的長度
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void async function () {// Write your code herewhile(line = await readline()){let arr = line.split(' ');console.log(arr[arr.length-1].length)}}()
核心代碼
let arr = line.split(' ');
console.log(arr[arr.length-1].length)
題目八 字符串排序
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void async function () {// Write your code herelet tokens = []while(line = await readline()){tokens.push(line)}tokens.shift()tokens.sort()tokens.forEach((item)=>{console.log(item)})
}()
核心代碼:
let tokens = []while(line = await readline()){tokens.push(line)}tokens.shift()tokens.sort()tokens.forEach((item)=>{console.log(item)})
題目九 求int型正整數在內存中存儲時1的個數
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void async function () {// Write your code herewhile(line = await readline()){let num = eval(line).toString(2)let arr = num.split('0')console.log(arr.join('').length)}
}()
用到的知識點:
① eval(line).toString(2)轉進制;
② 使用split(‘0’),將字符里面的 0 都給剔除;
③ 然后將所有的 1 拼接,計算該字符串的長度,就是數字 1 的數量;
題目十 坐標移動
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {// Write your code herelet x = 0,y = 0;let arr = []while ((line = await readline())) {arr = line.split(';')}// 字符串 有可能沒有ABCD,有可能有多個ABCD,有可能ABCD不是開頭,只要不符合規范就拋棄// A向左x減,D向右加,W向上Y加,S向下Y減let _key = ['A','D','W','S']arr.forEach((item)=>{if(_key.indexOf(item.slice(0,1)) !== -1 && item.length <= 3 && item.length > 1 && !isNaN(item.slice(1)) ){if(item.slice(0,1) == 'A'){x = x - Number(item.slice(1));}else if(item.slice(0,1) == 'D'){x = x + Number(item.slice(1));}else if(item.slice(0,1) == 'W'){y = y + Number(item.slice(1));}else if(item.slice(0,1) == 'S'){y = y - Number(item.slice(1));} }})console.log(x+","+y)
})();
重點就是將符合規范的字符串指令給篩選出來;
我的思路是:單個字符串指令的開頭必須是ADWS中的一個,然后字符串長度必須是2或者3,然后字符串除去開頭,后面的尾部必須是Number,所以就有了
_key.indexOf(item.slice(0,1)) !== -1 && item.length <= 3 && item.length > 1 && !isNaN(item.slice(1))
題目十一 簡單錯誤記錄
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {// Write your code herelet arr = []; // 記錄輸入while ((line = await readline())) {arr.push(line);}let lastarr = [];arr.forEach((item) => {// 獲取16字符 和代碼和行數let _item = item.split(" ");let _laststr = _item[0].split("\\");if (_laststr[_laststr.length - 1].length > 16) {let _len = _laststr[_laststr.length - 1].slice(_laststr[_laststr.length - 1].length - 16);lastarr.push([_len, _item[1]]);} else {lastarr.push([_laststr[_laststr.length - 1], _item[1]]);}});let _obj = {};lastarr.forEach((item, index) => {// 記錄出現次數let _parm = item[0]+item[1]if (_obj[_parm] != undefined) {_obj[_parm]++;} else if (_obj[_parm] == undefined) {_obj[_parm] = 1;}});// 二維數組去重let stringarr = lastarr.map(JSON.stringify);let uniquesstring = [...new Set(stringarr)];lastarr = uniquesstring.map(JSON.parse)if(lastarr.length>8){lastarr = lastarr.slice(lastarr.length - 8);// 取前8個}lastarr.forEach((item,index)=>{// 展示let _parm = item[0]+item[1]console.log(item.join(' ') + " "+_obj[_parm])})
})();
解題思路:
① 首先將輸入的內容全部記錄下來;
② 將文件名(16字符)和行號,放到一個數組中;
③ 用一個對象,記錄下出現的次數;
④ 將文件名(16字符)和行號的數組,去重;(二維數組去重方法,和一維數組不太一樣)
⑤ 取前八個文件名(16字符)和行號,然后forEach展示;
重點:二維數組去重
// 二維數組去重let stringarr = lastarr.map(JSON.stringify);let uniquesstring = [...new Set(stringarr)];lastarr = uniquesstring.map(JSON.parse)
題目十二 密碼驗證合格程序
必備知識:正則;
https://www.cnblogs.com/wanguofeng/p/10731206.html
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {// Write your code herewhile ((line = await readline())) {// 字符串長度超過八個,重復子字符串的長度不能超過兩個let regListOne = [/^.{1,8}$/, /(.{3,}).*\1+.*/];let firstCheck = regListOne.every((item) => !item.test(line));if (firstCheck) {// 大小寫字母、數字、其他符號(除大小寫字母、數字、換行符、空白符)let regListTwo = [/[a-z]/, /[A-Z]/, /\d/, /[^a-zA-Z\d\n\s]/];let secondCheck = regListTwo.filter((item) => item.test(line));let result = secondCheck.length >= 3 ? "OK" : "NG"; // 至少滿足三個條件console.log(result);} else {console.log("NG");}}
})();
題目十三 簡單密碼
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {// Write your code herewhile ((str = await readline())) {let base = {2: "abc",3: "def",4: "ghi",5: "jkl",6: "mno",7: "pqrs",8: "tuv",9: "wxyz",};//先將小寫字母替換成數字let str1 = str.replace(/[a-z]/g, (x) => {for (const [key, value] of Object.entries(base)) {if (base[key].includes(x)) {x = key;return x;}}});//再將大寫字母替換成往后移一位的小寫字母,注意字母‘Z’需單獨拎出來轉變為‘a’let str2 = str1.replace(/[A-Z]/g, (x) => {x =x == "Z"? "a": String.fromCharCode(x.toLowerCase().charCodeAt(0) + 1);return x;});console.log(str2)}
})();
知識筆記:
① replace()
replace 本身是 JavaScript 字符串對象的一個方法,它允許接收兩個參數:
replace([RegExp|String],[String|Function])
第1個參數可以是一個普通的字符串或是一個正則表達式;
第2個參數可以是一個普通的字符串或是一個回調函數;
② Object.entries
Object.entries() 方法返回一個給定對象自身可枚舉屬性的鍵值對數組。
其排列與使用 for…in 循環遍歷該對象時返回的順序一致(區別在于 for-in 循環還會枚舉原型鏈中的屬性)。
③ charCodeAt()
charCodeAt() 方法可返回指定位置的字符的 Unicode 編碼,返回值是 0 - 65535 之間的整數,表示給定索引處的 UTF-16 代碼單元。
字符串中第一個字符的位置為 0, 第二個字符位置為 1,以此類推。
④ fromCharCode()
fromCharCode() 可接受一個指定的 Unicode 值,然后返回一個字符串。
注意:該方法是 String 的靜態方法,字符串中的每個字符都由單獨的 Unicode 數字編碼指定。使用語法: String.fromCharCode()。
題目十四 汽水瓶
JavaScript Node ACM模式
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;void (async function () {// Write your code herewhile ((line = await readline())) {if (line != 0) {// let all = 0;// fun(line)// function fun(num) { // if (num == 2 || num == 3) {// all = 1 + all;// } else if (num == 1 || num == 0) {// all = all;// } else {// let _more = num % 3;// all = (num-_more)/3 + all;// fun(_more + (num-_more)/3)// }// }// console.log(all);// 另一種解法,兩空瓶喝一瓶水console.log(Math.floor(parseInt(line) / 2))}}
})();
這個思想很好,兩空瓶喝一瓶水,在網上看的,受教了。