網易有道2017內推編程題2道

前言

其實本文的目的不全是這倆道題的解法上,而是加深對Node的基礎模塊readline的使用,先上題javascript

1.洗牌

題目:java

洗牌在生活中十分常見,如今須要寫一個程序模擬洗牌的過程。
如今須要洗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次以後從上往下的序列。node

輸入描述:函數

第一行一個數K(K ≤ 100),表示洗牌次數。第二行輸入最開始牌的序列(數字之間用空格隔開,且爲2的倍數)ui

輸出描述:spa

輸出一行,顯示最終的序列。數字之間用空格隔開,不要在行末輸出多餘的空格。線程

代碼:code

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<LeftList.length;i++){
                result.push(RightList[i]);
                result.push(LeftList[i]);
            }
            result = result.reverse()

            bool--;
            sequence = result.slice(0)

            if(bool==0){
                result.length = ans
                console.log(result.join(" "))
            }
        }

    }
    // 從新初始化相關變量
    if (bool == 0) {
        bool = -1;
        ans = 0;
    }
});

示例對象

圖片描述

2.構造隊列

題目:blog

小明同窗把1到n這n個數字按照必定的順序放入了一個隊列Q中。如今他對隊列Q執行了以下程序:

while(!Q.empty())              //隊列不空,執行循環
{
    int x=Q.front();            //取出當前隊頭的值x
    Q.pop();                 //彈出當前隊頭
    Q.push(x);               //把x放入隊尾
    x = Q.front();              //取出這時候隊頭的值
    printf("%d\n",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體驗一下

相關文章
相關標籤/搜索