摘要:小明同學發現,這段程序恰好按順序輸出了。現在小明想讓你構造出原始的隊列,你能做到嗎輸入描述第一行一個整數表示數據組數,每組數據輸入一個數,輸入的所有之和不超過。
前言
其實本文的目的不全是這倆道題的解法上,而是加深對Node的基礎模塊readline的使用,先上題
1.洗牌題目:
洗牌在生活中十分常見,現在需要寫一個程序模擬洗牌的過程。
現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張(上半堆),右手拿著第n+1張到第2n張(下半堆)。接著就開始洗牌的過程,先放下右手的最后一張牌,再放下左手的最后一張牌,接著放下右手的倒數第二張牌,再放下左手的倒數第二張牌,直到最后放下左手的第一張牌。接著把牌合并起來就可以了。
例如有6張牌,最開始牌的序列是1,2,3,4,5,6。首先分成兩組,左手拿著1,2,3;右手拿著4,5,6。在洗牌過程中按順序放下了6,3,5,2,4,1。把這六張牌再次合成一組牌之后,我們按照從上往下的順序看這組牌,就變成了序列1,4,2,5,3,6。
現在給出一個原始牌組,請輸出這副牌洗牌k次之后從上往下的序列。
輸入描述:
第一行一個數K(K ≤ 100),表示洗牌次數。第二行輸入最開始牌的序列(數字之間用空格隔開,且為2的倍數)
輸出描述:
輸出一行,顯示最終的序列。數字之間用空格隔開,不要在行末輸出多余的空格。
代碼:
var readline = require("readline");//引入readline模塊 const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal:false }); var bool = -1;// 初始狀態為負數,表示還沒開始讀取 var ans = 0; var sequence; var result = []; rl.on("line",function(line){ if(bool<0){ bool = parseInt(line.trim()); }else{ sequence = line.split(" ").map(function(index) { return parseInt(index); }) ans = sequence.length; while(bool!=0){ var LeftList = sequence.slice(0,ans/2).reverse(); var RightList = sequence.slice(ans/2,ans).reverse(); for(var i = 0;i示例
2.構造隊列題目:
小明同學把1到n這n個數字按照一定的順序放入了一個隊列Q中。現在他對隊列Q執行了如下程序:
while(!Q.empty()) //隊列不空,執行循環 { int x=Q.front(); //取出當前隊頭的值x Q.pop(); //彈出當前隊頭 Q.push(x); //把x放入隊尾 x = Q.front(); //取出這時候隊頭的值 printf("%d ",x); //輸出x Q.pop(); //彈出這時候的隊頭 }做取出隊頭的值操作的時候,并不彈出當前隊頭。
小明同學發現,這段程序恰好按順序輸出了1,2,3,...,n。現在小明想讓你構造出原始的隊列,你能做到嗎?輸入描述:
第一行一個整數T(T ≤ 100)表示數據組數,每組數據輸入一個數n(1 ≤ n ≤ 100000),輸入的所有n之和不超過200000。
輸出描述:
對于每組數據,輸出一行,表示原始的隊列。數字之間用一個空格隔開,不要在行末輸出多余的空格.
代碼:
var readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal:false }); var bool = -1; var cur_line = 0; var n; rl.on("line",function(line){ if(bool<0){ bool = parseInt(line.trim()); }else{ n = parseInt(line.trim()); cur_line++; var arr = []; for(var i=n;i>0;i--){ arr.unshift(i); var x = arr.pop(); arr.unshift(x); } console.log(arr.join(" ")); } if (bool == cur_line) { bool = -1; cur_line = 0; } });示例
關于readline模塊Readline是Node.js里實現標準輸入輸出的封裝好的模塊,通過這個模塊我們可以以逐行的方式讀取數據流,
而使用readline我們就得創建一個Interface對象,可以通過createInterface方法來創建,所以才有了上述代碼rl = readline.createInterface(options)
在這個方法中接收一個參數,參數是一個對象,對象的屬性有如下input: 屬性值為一個可以用來讀取流數據的對象,用于指定讀入數據的來源(必須);
output: 屬性值為一個可用來寫入流數據的對象,用于指定數據的輸出目標(必須);
completer: 用于 Tab 自動補全的可選函數。(不常用);
terminal: 如果希望 input 和 output 流像 TTY 一樣對待,那么傳遞參數 true ,并且經由 ANSI/VT100 轉碼。 默認情況下檢查 isTTY 是否在 output 流上實例化。(不常用)
常見的傳入參數如上述代碼所示
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });process是node的一個全局進程,且是主線程,可自行百度
完成參數的傳入后便需要通過Interface對象的line事件來回調,在該事件的回調函數中同樣需要使用一個參數,該參數的值為被讀取的該行數據
通俗的講就是說在這個函數里,你事先一開始傳入了第一條數據,那么參數的值就是該條數據,然后在函數體里能夠對該數據進行處理,當你完成數據的讀取后,也就是你在鍵盤上按下了enter鍵,此時在寫入一行數據,那么該參數就是你第二次寫入的這條數據,同樣的在函數體里你可以對該數據進行處理
如上述代碼所示rl.on("line",function(line){ //··· }感興趣的可以ctrlC+V體驗一下
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81356.html
閱讀 1319·2021-11-24 09:38
閱讀 3256·2021-11-22 12:03
閱讀 4158·2021-11-11 10:59
閱讀 2317·2021-09-28 09:36
閱讀 1032·2021-09-09 09:32
閱讀 3412·2021-08-05 10:00
閱讀 2528·2021-07-23 15:30
閱讀 2973·2019-08-30 13:12