摘要:小易當前處在編號為的石板,他想跳到編號恰好為的石板去,小易想知道最少需要跳躍幾次可以到達。一天小易遇到這樣一個問題定義函數為最大的奇數約數,為正整數。可是小易現在只想購買恰好個蘋果,小易想購買盡量少的袋數方便攜帶。
前言
周末利用無聊的時間見識了一下網易的秋招編程題也嘗試用javascript來實現,總體的難度對我來說簡直是{{BANNED}}-_-!,不過最后總算在自己的能力范圍內解決了六道,其中有一道是參考了另一位大神的思路最終用代碼實現,還有一道反正我怎么想也想不出來~~有興趣的大神們可以嘗試一下讓我觀摩觀摩哈哈,下面放題
1.回文序列題目:
如果一個數字序列逆置之后跟原序列是一樣的就稱這樣的數字序列為回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
現在給出一個數字序列,允許使用一種轉換操作:
選擇任意兩個相鄰的數,然后從序列移除這兩個數,并用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。
現在對于所給序列要求出最少需要多少次操作可以將其變成回文序列。
輸入例子:[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個點。
輸出為一個整數,即為優雅的點的個數
輸入例子:25
輸出例子:12
我的思路:這題我在審題的時候誤把園內的點也算在內了,其實只是要求在圓上的點既可,該題有點像數學里的勾股定理,同理,我在做判斷的時候就是用半徑的平方減去遍歷的每一個坐標點的橫坐標的平方的結果再進行一個開方,然后判斷該數是否為整數,又因為該圓的圓心是坐標原點,那么符合條件的每一個坐標點都有4個方向,同時又要注意是否有坐標為0的情況,若有則減去4(例如:(0,+-5)和(+-5,0))
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挨著編號為:1、2、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:有的題可能還有更好的解法,只是暫時還沒想出來,主要就是那個跳石板怎么想都想不出來,希望有大神來幫忙解答哈哈^
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91272.html
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
摘要:參加了阿里的內推。面試前被要求做了一道編程題,現在分享一下。題目知識點閉包,構造函數與原型。題目要求的是點擊相應的刪除按鈕刪除列表的相應行。后來思考了一下,將循環內的代碼改為。 2017.8參加了阿里的內推。面試前被要求做了一道編程題,現在分享一下。 題目要求:巴拉巴拉具體忘記了,大概就是一個列表,每個列表后面有個刪除按鈕,點擊相應的刪除按鈕就可以刪除相應的列表的其中一行,并且要以面向...
閱讀 1860·2021-11-22 15:24
閱讀 1316·2021-11-12 10:36
閱讀 3219·2021-09-28 09:36
閱讀 1845·2021-09-02 15:15
閱讀 2760·2019-08-30 15:54
閱讀 2400·2019-08-30 11:02
閱讀 2398·2019-08-29 13:52
閱讀 3548·2019-08-26 11:53