摘要:小易當(dāng)前處在編號(hào)為的石板,他想跳到編號(hào)恰好為的石板去,小易想知道最少需要跳躍幾次可以到達(dá)。一天小易遇到這樣一個(gè)問題定義函數(shù)為最大的奇數(shù)約數(shù),為正整數(shù)。可是小易現(xiàn)在只想購(gòu)買恰好個(gè)蘋果,小易想購(gòu)買盡量少的袋數(shù)方便攜帶。
前言
周末利用無聊的時(shí)間見識(shí)了一下網(wǎng)易的秋招編程題也嘗試用javascript來實(shí)現(xiàn),總體的難度對(duì)我來說簡(jiǎn)直是{{BANNED}}-_-!,不過最后總算在自己的能力范圍內(nèi)解決了六道,其中有一道是參考了另一位大神的思路最終用代碼實(shí)現(xiàn),還有一道反正我怎么想也想不出來~~有興趣的大神們可以嘗試一下讓我觀摩觀摩哈哈,下面放題
1.回文序列題目:
如果一個(gè)數(shù)字序列逆置之后跟原序列是一樣的就稱這樣的數(shù)字序列為回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
現(xiàn)在給出一個(gè)數(shù)字序列,允許使用一種轉(zhuǎn)換操作:
選擇任意兩個(gè)相鄰的數(shù),然后從序列移除這兩個(gè)數(shù),并用這兩個(gè)數(shù)字的和插入到這兩個(gè)數(shù)之前的位置(只插入一個(gè)和)。
現(xiàn)在對(duì)于所給序列要求出最少需要多少次操作可以將其變成回文序列。
輸入例子:[1,1,1,3]
輸出例子:2
我的思路:首先清楚了回文序列的定義之后我可以用輸入的數(shù)組的字符串以及該數(shù)組倒序后的字符串進(jìn)行比較,以此來作為是否是回文序列的判斷,后觀察發(fā)現(xiàn)若需要最少操作來實(shí)現(xiàn)回文序列則必須使數(shù)字較小的數(shù)據(jù)來與后一個(gè)數(shù)據(jù)相加,舉輸入例子來說,數(shù)組第一位和最后一位的數(shù)字是1比3小,那么我在相加的時(shí)候就得拿1和后面的數(shù)字相加才能盡可能的與末尾的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.優(yōu)雅的點(diǎn)
題目:
小易有一個(gè)圓心在坐標(biāo)原點(diǎn)的圓,小易知道圓的半徑的平方。
小易認(rèn)為在圓上的點(diǎn)而且橫縱坐標(biāo)都是整數(shù)的點(diǎn)是優(yōu)雅的,
小易現(xiàn)在想尋找一個(gè)算法計(jì)算出優(yōu)雅的點(diǎn)的個(gè)數(shù),請(qǐng)你來幫幫他。
例如:半徑的平方如果為25
優(yōu)雅的點(diǎn)就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12個(gè)點(diǎn)。
輸出為一個(gè)整數(shù),即為優(yōu)雅的點(diǎn)的個(gè)數(shù)
輸入例子:25
輸出例子:12
我的思路:這題我在審題的時(shí)候誤把園內(nèi)的點(diǎn)也算在內(nèi)了,其實(shí)只是要求在圓上的點(diǎn)既可,該題有點(diǎn)像數(shù)學(xué)里的勾股定理,同理,我在做判斷的時(shí)候就是用半徑的平方減去遍歷的每一個(gè)坐標(biāo)點(diǎn)的橫坐標(biāo)的平方的結(jié)果再進(jìn)行一個(gè)開方,然后判斷該數(shù)是否為整數(shù),又因?yàn)樵搱A的圓心是坐標(biāo)原點(diǎn),那么符合條件的每一個(gè)坐標(biāo)點(diǎn)都有4個(gè)方向,同時(shí)又要注意是否有坐標(biāo)為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){ //驗(yàn)證開方后是否為整數(shù) if(i==0){ less=4; //驗(yàn)證是否存在有圓點(diǎn)的情況 } sum.push({i,coordinate}) } } return sum.length*4-less } else{ return "請(qǐng)輸入數(shù)字好嗎"; } } var Powr = 25; console.log(fn(Powr))3.跳石板
題目:
小易來到了一條石板路前,每塊石板上從1挨著編號(hào)為:1、2、3.......
這條石板路要根據(jù)特殊的規(guī)則才能前進(jìn):對(duì)于小易當(dāng)前所在的編號(hào)為K的 石板,
小易單次只能往前跳K的一個(gè)約數(shù)(不含1和K)步,即跳到K+X(X為K的一個(gè)非1和本身的約數(shù))的位置。
小易當(dāng)前處在編號(hào)為N的石板,他想跳到編號(hào)恰好為M的石板去,小易想知道最少需要跳躍幾次可以到達(dá)。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳躍5次,就可以從4號(hào)石板跳到24號(hào)石板
輸入例子:4 24
輸出例子:5
我的思路:這題。。。我能力有限,思路只想到用窮舉這個(gè)方法了,所以大神們?nèi)绻信d趣的話可以提供一下思路啊哈哈哈~
4.暗黑的字符串題目:
一個(gè)只包含"A"、"B"和"C"的字符串,
如果存在某一段長(zhǎng)度為3的連續(xù)子串中恰好"A"、"B"和"C"各有一個(gè),那么這個(gè)字符串就是純凈的,
否則這個(gè)字符串就是暗黑的。例如:
BAACAACCBAAA 連續(xù)子串"CBA"中包含了"A","B","C"各一個(gè),所以是純凈的字符串
AABBCCAABB 不存在一個(gè)長(zhǎng)度為2的連續(xù)子串包含"A","B","C",所以是暗黑的字符串
你的任務(wù)就是計(jì)算出長(zhǎng)度為n的字符串(只包含"A"、"B"和"C"),有多少個(gè)是暗黑的字符串。
輸入例子:2,3
輸出例子:9,21
我的思路:這題的話坦白講考的并不是代碼,而是數(shù)學(xué)!!一開始我想著就是用3的n次方減去純凈的字符串個(gè)數(shù)那么得出來的就是暗黑的字符串,但我看了下面這個(gè)圖,我簡(jiǎn)直膜拜
具體的代碼實(shí)現(xiàn)比較簡(jiǎn)單,關(guā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.數(shù)字翻轉(zhuǎn)
題目:
對(duì)于一個(gè)整數(shù)X,定義操作rev(X)為將X按數(shù)位翻轉(zhuǎn)過來,并且去除掉前導(dǎo)0。例如:
如果 X = 123,則rev(X) = 321;
如果 X = 100,則rev(X) = 1.
現(xiàn)在給出整數(shù)x和y,要求rev(rev(x) + rev(y))為多少?
輸入例子:123,100
輸出例子:223
我的思路:該題相對(duì)來說不算很難,整體的思路就是利用數(shù)組里的reverse,關(guān)鍵就是如何把數(shù)字的每一位轉(zhuǎn)為對(duì)應(yīng)的數(shù)組
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.最大的奇約數(shù)
題目:
小易是一個(gè)數(shù)論愛好者,并且對(duì)于一個(gè)數(shù)的奇數(shù)約數(shù)十分感興趣。
一天小易遇到這樣一個(gè)問題: 定義函數(shù)f(x)為x最大的奇數(shù)約數(shù),x為正整數(shù)。 例如:f(44) = 11.
現(xiàn)在給出一個(gè)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
小易計(jì)算這個(gè)問題遇到了困難,需要你來設(shè)計(jì)一個(gè)算法幫助他。
輸入例子:7
輸出例子:21
我的思路:該題的題意不難理解,明白的題意實(shí)現(xiàn)起來并不難,這里我用approximately函數(shù)來獲取我輸入的數(shù)字的所有約數(shù),再經(jīng)過判斷獲取最大的奇數(shù)約數(shù)從而實(shí)現(xiàn),一開始我想到的是遞歸方法,不過。。能不用遞歸就不用遞歸對(duì)吧^ ^
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.買蘋果
題目:
小易去附近的商店買蘋果,奸詐的商販?zhǔn)褂昧死壗灰祝?br>只提供6個(gè)每袋和8個(gè)每袋的包裝(包裝不可拆分)。 可是小易現(xiàn)在只想購(gòu)買恰好n個(gè)蘋果,小易想購(gòu)買盡量少的袋數(shù)方便攜帶。
如果不能購(gòu)買恰好n個(gè)蘋果,小易將不會(huì)購(gòu)買。
輸入例子:20
輸出例子:3
我的思路:輸出的結(jié)果只能是偶數(shù),且每次包裝袋子的時(shí)候都是盡量選擇8個(gè)每袋包裝的袋子,這樣可以盡可能用最少的袋子來購(gòu)買蘋果,所以我列舉了前幾個(gè)比較特殊的選袋情況作為遞歸的判斷條件(用一次遞歸嘿嘿),代碼如下
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.計(jì)算糖果
題目:
A,B,C三個(gè)人是好朋友,每個(gè)人手里都有一些糖果,我們不知道他們每個(gè)人手上具體有多少個(gè)糖果,但是我們知道以下的信息:
A - B, B - C, A + B, B + C. 這四個(gè)數(shù)值.每個(gè)字母代表每個(gè)人所擁有的糖果數(shù).
現(xiàn)在需要通過這四個(gè)數(shù)值計(jì)算出每個(gè)人手里有多少個(gè)糖果,即A,B,C。這里保證最多只有一組整數(shù)A,B,C滿足所有題設(shè)條件
輸入例子:1 -2 3 4
輸出例子:2 1 3
我的思路:一開始我是比較笨的才用分別利用輸入的例子的每一個(gè)對(duì)應(yīng)關(guān)系來寫式子從而一個(gè)一個(gè)遍歷判斷,但其實(shí)經(jīng)過觀察可以發(fā)現(xiàn)A-B和A+B這兩種情況相加后得出來的結(jié)果是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:有的題可能還有更好的解法,只是暫時(shí)還沒想出來,主要就是那個(gè)跳石板怎么想都想不出來,希望有大神來幫忙解答哈哈^
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91272.html
摘要:讓你收獲滿滿碼個(gè)蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個(gè)蛋從2017年02月20...
摘要:參加了阿里的內(nèi)推。面試前被要求做了一道編程題,現(xiàn)在分享一下。題目知識(shí)點(diǎn)閉包,構(gòu)造函數(shù)與原型。題目要求的是點(diǎn)擊相應(yīng)的刪除按鈕刪除列表的相應(yīng)行。后來思考了一下,將循環(huán)內(nèi)的代碼改為。 2017.8參加了阿里的內(nèi)推。面試前被要求做了一道編程題,現(xiàn)在分享一下。 題目要求:巴拉巴拉具體忘記了,大概就是一個(gè)列表,每個(gè)列表后面有個(gè)刪除按鈕,點(diǎn)擊相應(yīng)的刪除按鈕就可以刪除相應(yīng)的列表的其中一行,并且要以面向...
摘要:參加了阿里的內(nèi)推。面試前被要求做了一道編程題,現(xiàn)在分享一下。題目知識(shí)點(diǎn)閉包,構(gòu)造函數(shù)與原型。題目要求的是點(diǎn)擊相應(yīng)的刪除按鈕刪除列表的相應(yīng)行。后來思考了一下,將循環(huán)內(nèi)的代碼改為。 2017.8參加了阿里的內(nèi)推。面試前被要求做了一道編程題,現(xiàn)在分享一下。 題目要求:巴拉巴拉具體忘記了,大概就是一個(gè)列表,每個(gè)列表后面有個(gè)刪除按鈕,點(diǎn)擊相應(yīng)的刪除按鈕就可以刪除相應(yīng)的列表的其中一行,并且要以面向...
閱讀 1848·2021-11-22 15:24
閱讀 1307·2021-11-12 10:36
閱讀 3194·2021-09-28 09:36
閱讀 1837·2021-09-02 15:15
閱讀 2745·2019-08-30 15:54
閱讀 2391·2019-08-30 11:02
閱讀 2392·2019-08-29 13:52
閱讀 3539·2019-08-26 11:53