網易2017秋招編程題集合+本身的結果

前言

週末利用無聊的時間見識了一下網易的秋招編程題也嘗試用javascript來實現,整體的難度對我來講簡直是變態-_-!,不過最後總算在本身的能力範圍內解決了六道,其中有一道是參考了另外一位大神的思路最終用代碼實現,還有一道反正我怎麼想也想不出來~~有興趣的大神們能夠嘗試一下讓我觀摩觀摩哈哈,下面放題javascript


1.迴文序列

題目:
若是一個數字序列逆置以後跟原序列是同樣的就稱這樣的數字序列爲迴文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。
如今給出一個數字序列,容許使用一種轉換操做:
選擇任意兩個相鄰的數,而後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數以前的位置(只插入一個和)。
如今對於所給序列要求出最少須要多少次操做能夠將其變成迴文序列。java

輸入例子:[1,1,1,3]算法

輸出例子:2編程

個人思路:首先清楚了迴文序列的定義以後我能夠用輸入的數組的字符串以及該數組倒序後的字符串進行比較,以此來做爲是不是迴文序列的判斷,後觀察發現若須要最少操做來實現迴文序列則必須使數字較小的數據來與後一個數據相加,舉輸入例子來講,數組第一位和最後一位的數字是1比3小,那麼我在相加的時候就得拿1和後面的數字相加才能儘量的與末尾的3相等。數組

var result = 0;
function fn(arr){
    var revArr = arr.slice(0).reverse();
    if(revArr.join("")==arr.join("")){
        return result
    }
    else if (revArr[0]==arr[0]) {
        arr.shift();
        arr.pop()
        return fn(arr)
    }
    else {
        revArr.splice(0,2,revArr[0]+revArr[1])
        arr.splice(0,2,arr[0]+arr[1])
        arr[0]>revArr[0]?fn(revArr):fn(arr);
        return ++result
    }
}

var arr = [3,1,1,2,2]
console.log(fn(arr))

2.優雅的點

題目:
小易有一個圓心在座標原點的圓,小易知道圓的半徑的平方。
小易認爲在圓上的點並且橫縱座標都是整數的點是優雅的,
小易如今想尋找一個算法計算出優雅的點的個數,請你來幫幫他。
例如:半徑的平方若是爲25
優雅的點就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12個點。
輸出爲一個整數,即爲優雅的點的個數app

輸入例子:25less

輸出例子:12函數

個人思路:這題我在審題的時候誤把園內的點也算在內了,其實只是要求在圓上的點既可,該題有點像數學裏的勾股定理,同理,我在作判斷的時候就是用半徑的平方減去遍歷的每個座標點的橫座標的平方的結果再進行一個開方,而後判斷該數是否爲整數,又由於該圓的圓心是座標原點,那麼符合條件的每個座標點都有4個方向,同時又要注意是否有座標爲0的狀況,如有則減去4(例如:(0,+-5)和(+-5,0))spa

function fn(Powr){
    var sum = [];
    var less = 0;
    if(typeof Powr == "number"){
        for(var i=0;i<=Math.sqrt(Powr);i++){
            var coordinate = Math.sqrt(Powr-Math.pow(i,2))
            if(coordinate.toString().split(".")[1]==undefined){ //驗證開方後是否爲整數
                if(i==0){
                    less=4; //驗證是否存在有圓點的狀況
                }
                sum.push({i,coordinate})
            }
        }
        return sum.length*4-less
    }
    else{
        return "請輸入數字好嗎";
    }
}

var Powr = 25;
console.log(fn(Powr))

3.跳石板

題目:
小易來到了一條石板路前,每塊石板上從1挨着編號爲:一、二、3.......
這條石板路要根據特殊的規則才能前進:對於小易當前所在的編號爲K的 石板,
小易單次只能往前跳K的一個約數(不含1和K)步,即跳到K+X(X爲K的一個非1和自己的約數)的位置。
小易當前處在編號爲N的石板,他想跳到編號剛好爲M的石板去,小易想知道最少須要跳躍幾回能夠到達。
例如:
N = 4,M = 24:
4->6->8->12->18->24
因而小易最少須要跳躍5次,就能夠從4號石板跳到24號石板 設計

輸入例子:4 24

輸出例子:5

個人思路:這題。。。我能力有限,思路只想到用窮舉這個方法了,因此大神們若是感興趣的話能夠提供一下思路啊哈哈哈~

4.暗黑的字符串

題目:
一個只包含'A'、'B'和'C'的字符串,
若是存在某一段長度爲3的連續子串中剛好'A'、'B'和'C'各有一個,那麼這個字符串就是純淨的,
不然這個字符串就是暗黑的。例如:
BAACAACCBAAA 連續子串"CBA"中包含了'A','B','C'各一個,因此是純淨的字符串
AABBCCAABB 不存在一個長度爲2的連續子串包含'A','B','C',因此是暗黑的字符串
你的任務就是計算出長度爲n的字符串(只包含'A'、'B'和'C'),有多少個是暗黑的字符串。

輸入例子:2,3

輸出例子:9,21

個人思路:這題的話坦白講考的並非代碼,而是數學!!一開始我想着就是用3的n次方減去純淨的字符串個數那麼得出來的就是暗黑的字符串,但我看了下面這個圖,我簡直膜拜
圖片描述

具體的代碼實現比較簡單,關鍵仍是思路以及MATH!!

function fn(num){
    
    if(num==1){
        return 3
    }
    else if(num==2){
        return 9
    }
    else{
        return 2*fn(num-1)+fn(num-2)
    }

}

var num=3;
console.log(fn(num))

5.數字翻轉

題目:
對於一個整數X,定義操做rev(X)爲將X按數位翻轉過來,而且去除掉前導0。例如:
若是 X = 123,則rev(X) = 321;
若是 X = 100,則rev(X) = 1.
如今給出整數x和y,要求rev(rev(x) + rev(y))爲多少?

輸入例子:123,100

輸出例子:223

個人思路:該題相對來講不算很難,總體的思路就是利用數組裏的reverse,關鍵就是如何把數字的每一位轉爲對應的數組

function rev(num){
    var revArr = num.toString().split("").reverse().join("");
    return parseInt(revArr)
}

var x = 123;
var y = 100;
console.log(rev(rev(x) + rev(y)))

6.最大的奇約數

題目:
小易是一個數論愛好者,而且對於一個數的奇數約數十分感興趣。
一天小易遇到這樣一個問題: 定義函數f(x)爲x最大的奇數約數,x爲正整數。 例如:f(44) = 11.
如今給出一個N,須要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易計算這個問題遇到了困難,須要你來設計一個算法幫助他。

輸入例子:7

輸出例子:21

個人思路:該題的題意不難理解,明白的題意實現起來並不難,這裏我用approximately函數來獲取我輸入的數字的全部約數,再通過判斷獲取最大的奇數約數從而實現,一開始我想到的是遞歸方法,不過。。能不用遞歸就不用遞歸對吧^ ^

function fn(num){
    var sum = 0;
    for(var j=num;j>0;j--){
        var apprNum = approximately(j);
        for(var i=apprNum.length-1;i>=0;i--){
            if(apprNum[i]%2){
                sum += apprNum[i];
                break;
            }
        }
    }
    return sum
}

function approximately(num){
    var result = []
    for(var i=1;i<=num;i++){
        if(num%i==0){
            result.push(i)
        }
    }
    if(result.length>0){
        return result
    }else{
        return false
    }
}

console.log( fn(7) )

7.買蘋果

題目:
小易去附近的商店買蘋果,奸詐的商販使用了捆綁交易,
只提供6個每袋和8個每袋的包裝(包裝不可拆分)。 但是小易如今只想購買剛好n個蘋果,小易想購買儘可能少的袋數方便攜帶。
若是不能購買剛好n個蘋果,小易將不會購買。

輸入例子:20

輸出例子:3

個人思路:輸出的結果只能是偶數,且每次包裝袋子的時候都是儘可能選擇8個每袋包裝的袋子,這樣能夠儘量用最少的袋子來購買蘋果,因此我列舉了前幾個比較特殊的選袋狀況做爲遞歸的判斷條件(用一次遞歸嘿嘿),代碼以下

var freq = 0;
function fn(num){
    if(!(num%2)&&num>=12){
        if(num==12||num==14||num==16){
            return freq+=2;
        }
        else if(num==18){
            return freq+=3;
        }
        else{
            ++freq
            return fn(num-8)
        }
    }
    else{
        return -1;
    }
}

console.log(fn(40))

8.計算糖果

題目:
A,B,C三我的是好朋友,每一個人手裏都有一些糖果,咱們不知道他們每一個人手上具體有多少個糖果,可是咱們知道如下的信息:
A - B, B - C, A + B, B + C. 這四個數值.每一個字母表明每一個人所擁有的糖果數.
如今須要經過這四個數值計算出每一個人手裏有多少個糖果,即A,B,C。這裏保證最多隻有一組整數A,B,C知足全部題設條件

輸入例子:1 -2 3 4

輸出例子:2 1 3

個人思路:一開始我是比較笨的才用分別利用輸入的例子的每個對應關係來寫式子從而一個一個遍歷判斷,但其實通過觀察能夠發現A-B和A+B這兩種狀況相加後得出來的結果是2A,依次類推,後面就迎刃而解了

function fn(num){
    var A = (num[0]+num[2])/2;
    var B = (num[1]+num[3])/2;
    if(A.toString().split(".")[1]==undefined&&B.toString().split(".")[1]==undefined){
        var C = num[3]-B;
        return A+" "+B+" "+C
    }
    else{
        return "No"
    }
}

var num = [1,-2,3,4]
console.log(fn(num))

PS:有的題可能還有更好的解法,只是暫時還沒想出來,主要就是那個跳石板怎麼想都想不出來,但願有大神來幫忙解答哈哈^

相關文章
相關標籤/搜索