web大前端復(fù)習(xí)——js常見(jiàn)算法題2

Q19 回文解碼

現(xiàn)在有一個(gè)字符串,你要對(duì)這個(gè)字符串進(jìn)行 n 次操作,每次操作給出兩個(gè)數(shù)字:(p, l) 表示當(dāng)前字符串中從下標(biāo)為 p 的字符開(kāi)始的長(zhǎng)度為 l 的一個(gè)子串。你要將這個(gè)子串左右翻轉(zhuǎn)后插在這個(gè)子串原來(lái)位置的正后方,求最后得到的字符串是什么。字符串的下標(biāo)是從 0 開(kāi)始的,你可以從樣例中得到更多信息。輸入描述:

每組測(cè)試用例僅包含一組數(shù)據(jù),每組數(shù)據(jù)第一行為原字符串,長(zhǎng)度不超過(guò) 10 ,僅包含大小寫(xiě)字符與數(shù)字。接下來(lái)會(huì)有一個(gè)數(shù)字 n 表示有 n 個(gè)操作,再接下來(lái)有 n 行,每行兩個(gè)整數(shù),表示每次操作的(p , l)。保證輸入的操作一定合法,最后得到的字符串長(zhǎng)度不超過(guò) 1000。

輸出描述:

輸出一個(gè)字符串代表最后得到的字符串。

輸入例子:

ab

2

0 2

1 3

輸出例子:

abbaabb

??????? function reversecion(input){

??????????? var arr = input.split('\n')

??????????? var str=arr[0],

??????????????? num=arr[1]

??????????? for(var i=0;i<num;i++){

??????????????? var arrtemp = arr[i+2]

??????????????? var start=arrtemp.split(' ')

??????????????? var startnum = + start[0]

??????????????? var endnum = + start[1]

??????????????? var temp=str.substr(startnum,endnum)

??????????????? str=str.substr(0,startnum+endnum)+temp.split("").reverse().join("") +str.substr(startnum+endnum)

??????????? }

??????????? return str;

??????? }

??????? var input = "ab\n2\n0 2\n1 3"

??????? console.log(reversecion(input)) //abbaabb

??????? var input1= "abc\n2\n0 2\n1 2"

??????? console.log(reversecion(input1))??? //abbbbac

substring()

substr()

slice()

slice()

第一個(gè)參數(shù)代表開(kāi)始位置,第二個(gè)參數(shù)代表結(jié)束位置的下一個(gè)位置,截取出來(lái)的字符串的長(zhǎng)度為第二個(gè)參數(shù)與第一個(gè)參數(shù)之間的差;若參數(shù)值為負(fù)數(shù),則將該值加上字符串長(zhǎng)度后轉(zhuǎn)為正值;若第一個(gè)參數(shù)等于大于第二個(gè)參數(shù),則返回空字符串.

substring()

第一個(gè)參數(shù)代表開(kāi)始位置,第二個(gè)參數(shù)代表結(jié)束位置的下一個(gè)位置;若參數(shù)值為負(fù)數(shù),則將該值轉(zhuǎn)為0;兩個(gè)參數(shù)中,取較小值作為開(kāi)始位置,截取出來(lái)的字符串的長(zhǎng)度為較大值與較小值之間的差.

substr()

第一個(gè)參數(shù)代表開(kāi)始位置,第二個(gè)參數(shù)代表截取的長(zhǎng)度

Q20 你作為一名出道的歌手終于要出自己的第一份專輯了,你計(jì)劃收錄 n 首歌而且每首歌的長(zhǎng)度都是 s 秒,每首歌必須完整地收錄于一張 CD 當(dāng)中。每張 CD 的容量長(zhǎng)度都是 L 秒,而且你至少得保證同一張 CD 內(nèi)相鄰兩首歌中間至少要隔 1 秒。為了辟邪,你決定任意一張 CD 內(nèi)的歌數(shù)不能被 13 這個(gè)數(shù)字整除,那么請(qǐng)問(wèn)你出這張專輯至少需要多少?gòu)?CD ?

輸入描述:

每組測(cè)試用例僅包含一組數(shù)據(jù),每組數(shù)據(jù)第一行為三個(gè)正整數(shù) n, s, L。 保證 n ≤ 100 , s ≤ L ≤ 10000

輸出描述:

輸出一個(gè)整數(shù)代表你至少需要的 CD 數(shù)量。

輸入例子:

7 2 6

輸出例子:

4

??????? function getNum(n,s,l){

??????????? var maxPerCD =? parseInt((l+1) / (s+1));

??????????? var num= 0;

??????????? if(maxPerCD>n){

??????????????? if(n%13==0){

??????????????????? return 2

??????????????? }else{

??????????????????? return 1

??????????????? }

??????????? }

??????????? if(maxPerCD%13==0){

??????????????? maxPerCD--;

??????????? }

??????????? if(n%maxPerCD==0){

??????????????? return n/maxPerCD

??????????? }else{

??????????????? if(n%maxPerCD%13==0&&(n%maxPerCD==maxPerCD-1)){ //如果余數(shù)可被13整除,并且余數(shù)等于每張CD最多歌數(shù)-1,

????????????????? // 這時(shí)候余數(shù)不能單獨(dú)一張CD,也不能再?gòu)钠渌鸆D挪一張,只能再加一張CD

??????????????????? return parseInt(n/maxPerCD)+2

??????????????? }else{

??????????????????? return parseInt(n/maxPerCD)+1

??????????????? }

??????????? }

??????? }

??????? console.log(getNum(7,2,6))? //4

??????? console.log(getNum(28,30,400))? //3

Q21 從一個(gè)數(shù)組中找出與給定數(shù)字最接近的元素。例如,數(shù)組[1,23,24,14,31,45,11,18,54,47,75,99,65],給定值70,輸出75.

??????? var arr = [1,23,24,14,31,45,11,18,54,47,75,99,65];

??????? var n = 70;

??????? function findNear(arr,n){

????????? var returnNum,cha,temp;

????????? for(var i=0;i<arr.length;i++){

??????????? temp = Math.abs(arr[i]-n)

??????????? if(!cha||cha>temp){

????????????? cha = temp

????????????? returnNum = arr[i]

??????????? }

????????? }

????????? return returnNum

??????? }

??????? console.log(findNear(arr,n))

Q22 倒序打印鏈表的值,列如

node = {

??????????? val:1,

??????????? next:{

??????????????? val:2,

??????????????? next:{

??????????????????? val:3,

??????????????????? next:{

??????????????????????? val:4

??????????????????? }

??????????????? }

??????????? }

??????? }

輸出 4 3 2 1

并且不能用web存儲(chǔ),比如不能使用臨時(shí)變量 var temp = XXX

面試今日頭條被問(wèn)到了這個(gè)問(wèn)題,當(dāng)時(shí)沒(méi)想上來(lái)。

??????? var node = {

??????????? val:1,

??????????? next:{

??????????????? val:2,

??????????????? next:{

??????????????????? val:3,

??????????????????? next:{

??????????????????????? val:4

??????????????????? }

??????????????? }

??????????? }

??????? }

??????? function reverseFun(node){

??????????? if(!node){

??????????????? return

??????????? }else{

??????????????? reverseFun(node.next)

??????????????? console.log(node.val)

??????????? }

??????? }

??????? reverseFun(node);

Q23 從一個(gè)有序數(shù)組中找出兩個(gè)元素之和等于給定值得元素角標(biāo)的集合,只能使用單次遍歷,例如,從數(shù)組 [1,2,5,7,9,12,15,18]中找出兩個(gè)和為19的元素的集合,輸出[0,7] [3,5]。

??????? var arr = [1,2,5,7,9,12,15,18]

??????? var s= 19

??????? function fun(arr,s){

??????????? var len = arr.length

??????????? var i=0,j=len-1

??????????? while(i<j){

??????????????? if((arr[i]+arr[j])<s){

??????????????????? i++

??????????????? }else if((arr[i]+arr[j])>s){

??????????????????? j--

??????????????? }else{

??????????????????? var res = [i,j]

??????????????????? console.log(res)

??????????????????? i++

??????????????????? j--

??????????????? }

??????????? }

??????? }

??????? fun(arr,s)

//[0, 7]? [3, 5]

Q24 求二叉樹(shù)中和值為n的路徑

題目描述:

輸入一顆二叉樹(shù)和一個(gè)整數(shù),打印出二叉樹(shù)中結(jié)點(diǎn)值的和為輸入整數(shù)的所有路徑。路徑定義為從樹(shù)的根結(jié)點(diǎn)開(kāi)始往下一直到葉結(jié)點(diǎn)所經(jīng)過(guò)的結(jié)點(diǎn)形成一條路徑。

思路

前序遍歷二叉樹(shù),每次更新當(dāng)前路徑的和curtSum;

判斷當(dāng)前結(jié)點(diǎn)是否是葉子結(jié)點(diǎn),以及curtSum是否等于expectNumber。如果是,把當(dāng)前路徑保存在res結(jié)果中;

若不符合條件,則彈出此結(jié)點(diǎn)。

實(shí)現(xiàn)代碼

??????? var tree = {

??????????? "val": 0,

??????????? "left": {

??????????????? "val": 1,

??????????????? "left": {

??????????????????? "val": 3,

??????????????????? "left": {

??????????????????????? "val": 7,

??????????????????????? "left": {

??????????????????????????? "val": 11,

??????????????????????? }

??????????????????? },

??????????????????? "right": {

??????????????????????? "val": 8,

??????????????????????? "left": {

??????????????????????????? "val": 12,

??????????????????????? }

??????????????????? }

??????????????? },

??????????????? "right": {

??????????????????? "val": 4,

??????????????????? "left": {

??????????????????????? "val": 9,

??????????????????? }

??????????????? }

??????????? },

??????????? "right": {

??????????????? "val": 2,

??????????????? "left": {

??????????????????? "val": 5,

??????????????? },

??????????????? "right": {

??????????????????? "val": 6,

??????????????????? "right": {

??????????????????????? "val": 10,

??????????????????? }

??????????????? }

??????????? }

??????? }

??????? function FindPath(root, expectNumber) {

??????????? var result = [];

??????????? if (root === null) {

??????????????? return result;

??????????? }

??????????? dfsFind(root, expectNumber, [], 0, result);

??????????? return result;

??????? }

??????? function dfsFind(root, expectNumber, path, currentSum, result) {

??????????? currentSum += root.val;

??????????? path.push(root.val);

??????????? if (currentSum == expectNumber && root.left == null && root.right == null) {

??????????????? result.push(path.slice(0));

??????????? }

??????????? if (root.left != null) {

??????????????? dfsFind(root.left, expectNumber, path, currentSum, result);

??????????? }

??????????? if (root.right != null) {

??????????????? dfsFind(root.right, expectNumber, path, currentSum, result);

??????????? }

??????????? path.pop();

??????? }

??????? console.log(FindPath(tree,18)) // [0, 2, 6, 10]

Q25 有一個(gè)數(shù)組和一個(gè)給定的值,從數(shù)組中選擇任意數(shù),可以重復(fù)選擇,使其和為給定的值,求所需數(shù)最少的一組數(shù)。例如:數(shù)組[2,3,6,7] 常數(shù)7,[2,2,3] [7]兩種組合的和值為7,所以需要數(shù)最少的組合是[7]。

??????? var res = []

??????? function combinationSum(candidates,target){

????????? helper(candidates,target,[],0)

????????? var minNum = res[0].length,temp=0

????????? for(var i=1;i<res.length;i++){

??????????? if(res[i].length<minNum){

????????????? minNum= res[i].length

????????????? temp = i

??????????? }

????????? }

????????? console.log('所有符合條件的組合為:',res)

????????? console.log('最小個(gè)數(shù)為:', minNum)

????????? console.log('最小個(gè)數(shù)的組合為:', res[temp])

??????? }

??????? function helper(candidates,target,list,index){

??????????? if(target == 0){

????????????? res.push(list.slice())

??????????? }

??????????? for(var i=index;i<candidates.length;i++){

??????????????? if(candidates[i] <= target){

????????????????? list.push(candidates[i])

????????????????? helper(candidates,target-candidates[i], list, i)

????????????????? list.pop()

??????????????? }

??????????? }

??????? }

??????? combinationSum([1,3,4],6)

Q26 合并兩個(gè)降序排列的數(shù)組,使合并之后數(shù)組仍然降序排列,要求時(shí)間復(fù)雜度低。例如:[100,97,92,89,80,76] [96,93,88,72,71,66,55] 合并后為[100,97,96,93,92,89,88,80,76,72,71,66,55]

??????? var arr1 = [100,97,94,88,84,80,79,77,73,68,65,62,57,55,52,49,46,44]

??????? var arr2 = [96,93,90,89,85,78,74,69,63,59,57,56,52,48,46,33]

??????? function mergeFun(arr1,arr2){

????????? var i=0,j=0;

????????? var res = []

????????? while(i<arr1.length && j<arr2.length){

??????????? if(arr1[i] > arr2[j]){

????????????? res.push(arr1[i++])

??????????? }else if(arr1[i] == arr2[j]){

????????????? res.push(arr1[i++])

????????????? j++;

??????????? }else{

????????????? res.push(arr2[j++])

??????????? }

????????? }

????????? while(i<arr1.length){

??????????? res.push(arr1[i++])

????????? }

????????? while (j< arr2.length){

??????????? res.push(arr2[j++])

????????? }

????????? return res

??????? }

??????? console.log(mergeFun(arr1,arr2))

Q27 輸出楊輝三角第m行n列的值,m、n從0開(kāi)始。

我們很容易想到用遞歸的方法實(shí)現(xiàn),如下:

??????? function triangle1(m,n){

??????????? if(n==0||m==n){

??????????????? return 1

??????????? }

??????????? return (triangle1(m-1,n)||0) + (triangle1(m-1,n-1)||0)

??????? }

??????? console.log(triangle1(6,3))

遞歸的方法在計(jì)算較小的數(shù)時(shí)沒(méi)問(wèn)題,但是計(jì)算較大的數(shù)時(shí)就容易超時(shí)。

下面用數(shù)組的方法實(shí)現(xiàn)一下:

??????? function triangle(m,n){

??????????? var arr = [[1]]

??????????? for(var i=1;i<m;i++){

??????????????? arr[i] = []

??????????????? for(var j=0;j<=i;j++){

??????????????????? arr[i][j]= (arr[i-1][j-1] || 0) + (arr[i-1][j] || 0)

??????????????? }

??????????? }

??????????? return arr

??????? }

??????? console.log(triangle(64,30))

Q28 給定一個(gè)整數(shù)數(shù)組 arr ,找到一個(gè)具有最大和的連續(xù)子數(shù)組(子數(shù)組最少包含一個(gè)元素),返回其最大和。

例如,輸入: [-2,1,-3,4,-1,2,1,-5,4],

輸出: 6

解釋: 連續(xù)子數(shù)組 [4,-1,2,1] 的和最大,為 6。

動(dòng)態(tài)規(guī)劃法——O(N)

設(shè)sum[i]為以第i個(gè)元素結(jié)尾且和最大的連續(xù)子數(shù)組。假設(shè)對(duì)于元素i,所有以它前面的元素結(jié)尾的子數(shù)組的長(zhǎng)度都已經(jīng)求得,那么以第i個(gè)元素結(jié)尾且和最大的連續(xù)子數(shù)組實(shí)際上,要么是以第i-1個(gè)元素結(jié)尾且和最大的連續(xù)子數(shù)組加上這個(gè)元素,要么是只包含第i個(gè)元素,即sum[i]

= max(sum[i-1] + a[i], a[i])??梢酝ㄟ^(guò)判斷sum[i-1] + a[i]是否大于a[i]來(lái)做選擇,而這實(shí)際上等價(jià)于判斷sum[i-1]是否大于0。由于每次運(yùn)算只需要前一次的結(jié)果,因此并不需要像普通的動(dòng)態(tài)規(guī)劃那樣保留之前所有的計(jì)算結(jié)果,只需要保留上一次的即可,因此算法的時(shí)間和空間復(fù)雜度都很小

??? var arr = [2,4,-3,5,-1,3,-2,-6,-5,6]

??? function maxSubArray(arr){

????? var sum = arr[0],

????????? n = arr[0]; //當(dāng)前循環(huán)最大和值

????? for(var i=1;i<arr.length;i++){

??????? if(n>0){

????????? n += arr[i]

??????? }else{

????????? n = arr[i]

??????? }

??????? if(n>sum){

????????? sum = n

??????? }

????? }

????? return sum

??? }

??? console.log(maxSubArray(arr))

Q29 無(wú)重復(fù)字符的最長(zhǎng)子串的長(zhǎng)度

無(wú)重復(fù)字符的最長(zhǎng)子串

給定一個(gè)字符串,找出不含有重復(fù)字符的最長(zhǎng)子串的長(zhǎng)度。

示例:

給定 "abcabcbbefdxvbnmkjtgfsd" ,沒(méi)有重復(fù)字符的最長(zhǎng)子串是"fdxvbnmkjtg",那么長(zhǎng)度就是12。

給定 "bbbbb" ,最長(zhǎng)的子串就是 "b",長(zhǎng)度是1。

給定 "pwwkew",最長(zhǎng)子串是"wke",長(zhǎng)度是3。請(qǐng)注意答案必須是一個(gè)子串,"pwke"是 子序列 而不是子串。

思路分析:

對(duì)字符串進(jìn)行遍歷,使用String.prototype.indexOf()實(shí)時(shí)獲取遍歷過(guò)程中的無(wú)重復(fù)子串并存放于str,并保存當(dāng)前狀態(tài)最長(zhǎng)無(wú)重復(fù)子串的長(zhǎng)度為res,當(dāng)遍歷結(jié)束時(shí),res的值即為無(wú)重復(fù)字符的最長(zhǎng)子串的長(zhǎng)度。

??????? function longSubString(str){

??????????? var res =0,

??????????????? currentStr = '',

??????????????? len = str.length

??????????? for(var i=0;i<len;i++){

??????????????? var char = str.charAt(i);

??????????????? var index = currentStr.indexOf(char)

??????????????? if(index==-1){

??????????????????? currentStr += char

??????????????????? res = res< currentStr.length? currentStr.length: res

??????????????? }else{

??????????????????? currentStr = currentStr.substring(index+1) + char

??????????????? }

??????????? }

??????????? return res

??????? }

??????? console.log(longSubString('abcabcbbefdxvbnmkjtgfsd'))

Q30 刪除鏈表的倒數(shù)第N個(gè)節(jié)點(diǎn)

給定一個(gè)鏈表,刪除鏈表的倒數(shù)第 n 個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。

示例:

給定一個(gè)鏈表: 1->2->3->4->5, 和 n = 2.

當(dāng)刪除了倒數(shù)第二個(gè)節(jié)點(diǎn)后,鏈表變?yōu)?1->2->3->5.

說(shuō)明:

給定的 n 保證是有效的。

進(jìn)階:

你能嘗試使用一趟掃描實(shí)現(xiàn)嗎?

思路:

這道題要用雙指針來(lái)實(shí)現(xiàn)。先用first指針前進(jìn)n,然后讓second從head開(kāi)始和first一起前進(jìn),直到first到了末尾,此時(shí)second的下一個(gè)節(jié)點(diǎn)就是要?jiǎng)h除的節(jié)點(diǎn)。(另外,若first一開(kāi)始前進(jìn)n就已經(jīng)不在鏈表中了,說(shuō)明要?jiǎng)h除的節(jié)點(diǎn)正是head節(jié)點(diǎn),那么直接返回head的下一個(gè)節(jié)點(diǎn)接口。)

/**

* Definition for singly-linked list.

* function ListNode(val) {

*???? this.val = val;

*???? this.next = null;

* }

*/

/**

* @param {ListNode} head

* @param {number} n

* @return {ListNode}

*/

var removeNthFromEnd = function(head, n) {

? let first = head, second = head;

? while (n > 0) {

??? first = first.next

??? n--

? }

? if (!first) return head.next;???? // 刪除的是頭節(jié)點(diǎn)

? while (first.next) {

??? first = first.next;

??? second = second.next;

? }

? second.next = second.next.next;

? return head

}

Q31 寫(xiě)一個(gè)函數(shù)獲取兩個(gè)日期之間所有日期,放在對(duì)象里。

例如:getAllDate('2018/09/10','2019/03/04')

輸出:

??? {

??????? 2018:{

??????????? 9:[12,13,14,...30],

??????????? 10:[...],

??????????? 11:[...],

??????????? 12:[...]

??????? },

??????? 2019:{

??????????? 1:[...],

??????????? 2:[...],

??????????? 3:[1,2,3]

??????? }

??? }

??????? function getAllDate(startDate,endDate){

??????????? let startTime = new Date(startDate),

??????????????? endTime = new Date(endDate)

??????????? let arr = []

??????????? let dateObj = {}

??????????? while(startTime<endTime){

??????????????? let year = startTime.getFullYear()

??????????????? let month = startTime.getMonth()

??????????????? let day = startTime.getDate()

??????????????? arr.push(year +'/'+month +'/'+day)

??????????????? startTime.setDate(startTime.getDate() +1)

??????????? }

??????????? for(let i=0;i<arr.length;i++){

??????????????? let temp = arr[i].split('/')

??????????????? let year = parseInt(temp[0]),

??????????????????? month = parseInt(temp[1]) +1,

??????????????????? day = parseInt(temp[2])

??????????????? if(!dateObj[year]){

??????????????????? dateObj[year] = {}

??????????????? }

??????????????? if(!dateObj[year][month]){

??????????????????? dateObj[year][month] = []

??????????????? }

??????????????? dateObj[year][month].push(day)

??????????? }

??????????? return dateObj

??????? }

??????? console.log(getAllDate('2018/09/10','2019/03/04'))

Q32 給定一個(gè)字符串,形如:'a=12,b=23,c=k1,d=2s,k=$',請(qǐng)寫(xiě)一個(gè)find方法,給定左側(cè)值,找到右側(cè)值,例如:find('a'),打?。骸?2’。

??? var str = 'a=12,b=23,c=k1,d=2s,k=$'

??? function find(param){

??????? var arr= str.split(',')

??????? var obj={}

??????? for(var i=0;i<arr.length;i++){

??????????? obj[arr[i].split('=')[0]] = arr[i].split('=')[1]

??????? }

??????? console.log(obj[param])

??? }

??? find('k')

Q33 給定一個(gè)字符串,找出無(wú)重復(fù)字母的最長(zhǎng)子串。

這個(gè)題和29題類似

??? function func(str){

??????? var subStr = ''

??????? var arr = []

??????? var maxLen = 0

??????? var maxIndex=0

??????? var subMaxStr = ''

??????? for(var i=0;i<str.length;i++){

??????????? if(subStr.indexOf(str.charAt(i))===-1){

??????????????? subStr+=str.charAt(i)

??????????? }else{

??????????????? arr.push(subStr)

??????????????? subStr = subStr.split(str.charAt(i))[1]+str.charAt(i)

??????????? }

??????? }

??????? maxLen = arr[0].length

??????? subMaxStr = arr[0]

??????? for(var j=1;j<arr.length;j++){

??????????? if(arr[j].length>maxLen){

??????????????? maxLen =? arr[j].length

??????????????? maxIndex = j

??????????????? subMaxStr = arr[j]

??????????? }

??????? }

??????? console.log(subMaxStr)

??? }

??? func('zxcvbngfdvfeeewdfrgthfqwertyuiokjhofd')

??? func('zxcvbngfeefd')

方法二

??????? function getSubString(str){

??????????? let longSub = '',len=str.length,currentStr='',max=0

??????????? for(let i=0;i<len;i++){

??????????????? let char = str.charAt(i)

??????????????? if(currentStr.indexOf(char)==-1){

??????????????????? currentStr+=char

??????????????????? if(max<currentStr.length){

??????????????????????? max = currentStr.length

??????????????????????? longSub = currentStr

??????????????????? }

??????????????? }else{

??????????????????? currentStr = currentStr.substring(currentStr.indexOf(char)+1)+char

??????????????? }

??????????? }

??????????? return longSub

??????? }

??????? console.log(getSubString('zxcvbngfdvfeeewdfrgthfqwertyuiokjhofd'))

??????? console.log(getSubString('zxcvbngfeefd'))

Q34 給一個(gè)obj,要求實(shí)現(xiàn)一個(gè)console.tree(obj),在控制臺(tái)以縮進(jìn)的形式打印這個(gè)值的樹(shù)狀結(jié)構(gòu)(不要打印原型鏈中的方法名稱),例如:

var obj = {'x':1,'y':{'z':2,'b':4,'c':{'d':5}},'a':3}

打?。?/p>

??? console.__proto__.tree = function(json){

??????? var i=0

??????? var str = ''

??????? var fun= function(json){

??????????? for(var key in json){

??????????????? if(json.hasOwnProperty(key)){

??????????????????? if(typeof json[key] ==='object'){

??????????????????????? str+='\t'.repeat(i)+ '|---'+key+'\n'

??????????????????????? i++

??????????????????????? fun(json[key])

??????????????????????? i--

??????????????????? }else{

??????????????????????? str+= '\t'.repeat(i)+ '|---'+key+':'+json[key] +'\n'

??????????????????? }

??????????????? }

??????????? }

??????? }

??????? fun(json)

??????? console.log(str)

??? }

??? var json = {'x':1,'y':{'z':2,'b':4,'c':{'d':5}},'a':3}

??? console.tree(json)

Q35 有一組不同高度的臺(tái)階,有一個(gè)整數(shù)數(shù)組表示,數(shù)組中每個(gè)數(shù)是臺(tái)階的高度,當(dāng)開(kāi)始下雨了(雨水足夠多)臺(tái)階之間的水坑會(huì)積水多少呢?如下圖,可以表示為數(shù)組[0,1,0,2,1,0,1,3,2,1,2,1],返回積水量6。

方法一

先在這個(gè)數(shù)組中找到最大值,然后從左右兩邊遍歷。以左邊為例,只要當(dāng)前的數(shù)字比下一個(gè)數(shù)字大,那么這個(gè)數(shù)字的右邊就可以存水,按照這個(gè)思路去分析就可以了,右邊的也是一樣的道理。

代碼如下:

let maxIndex=0,max = arr[0]

for(let i=1;i<arr.length;i++){

??? if(arr[i]>max){

??????? max=arr[i]

??????? maxIndex = i

??? }

}

let sum = 0,leftMax=arr[0],rightMax=arr[arr.length-1]

for(let i=1;i<maxIndex;i++){

??? if(arr[i]<leftMax){

??????? sum += (leftMax-arr[i])

??? }else{

??????? leftMax = arr[i]

??? }

}

for(let j = arr.length-1;j>maxIndex;j--){

??? if(arr[j]<rightMax){

??????? sum += (rightMax - arr[j])

??? }else{

??????? rightMax = arr[j]

??? }

}

console.log(sum)

方法二

這個(gè)原理和方法一一樣,只需一次遍歷,相對(duì)方法一略微難理解。

let leftM = arr[0],rightM = arr[arr.length-1],leftIndex = 0,rightIndex = arr.length-1,volumn=0

while (leftIndex < rightIndex) {

??? if(leftM < rightM){

??????? leftIndex++

??????? if(arr[leftIndex]>leftM){

??????????? leftM = arr[leftIndex]

??????? }else{

??????????? volumn += (leftM-arr[leftIndex])

??????? }

??? }else{

??????? rightIndex--

??????? if(arr[rightIndex]>rightM){

??????????? rightM = arr[rightIndex]

??????? }else{

??????????? volumn += (rightM - arr[rightIndex])

??????? }

??? }

}

console.log(volumn)

Q36 替換字符串中所有指定的子字符串。

例如:替換‘a(chǎn)sssdfgghhjsssertyu’中‘sss’

方法一:

str.replace(/需要替換的字符串/g,"新字符串")

'asssdfgghhjsssertyu'.replace(/sss/g,'123')

這種形式要替換的字符串沒(méi)法用參數(shù),可以用

??????? var str = 'asssdfgghhjsssertyu'

??????? function replacer(str,str1,str2){

??????????? return str.replace(new RegExp(str1,'g'),str2)

??????? }

??????? console.log(replacer(str,'sss',12))

方法二

??????? var str = 'asssdfgghhjsssertyu'

??????? function replacer(str,str1,str2){

??????????? var arg = str.split(str1)

??????????? return arg.join(str2)

??????? }

?????? console.log(replacer(str,'sss',12))

Q 37 給定一個(gè)字符串,找到它的第一個(gè)不重復(fù)的字符,并返回它的索引。如果不存在,則返回 -1。

案例:

s = "leetcode"

返回 0.

s = "loveleetcode",

返回 2.

解法一? : 有點(diǎn)暴力,主要思路為拋出本身后,利用indexOf查詢查找是否存在重復(fù)值,不存在則直接返回當(dāng)前索引

/**

* @param {string} s

* @return {number}

*/

var firstUniqChar = function(s) {

??? var len = s.length;

??? for(var i=0;i<len;i++){

??????? var str? = s,

??????? test = str.split('');

??????? test.splice(i,1);

??????? var sub = test.indexOf(s[i]);

??????? if(sub === -1) return i;

??? }

??? return -1;

};

方法二

  方法一用到了indexOf ,所以時(shí)間復(fù)雜度也達(dá)到了O(n^2),

  則想到了利用哈希來(lái)存儲(chǔ)重復(fù)的次數(shù),在循環(huán)字符串查找哈希中值為1的這個(gè)字符,第一次遇到則返回,這樣循環(huán)次數(shù)相對(duì)減少時(shí)間復(fù)雜度也降到了O(n)

/**

* @param {string} s

* @return {number}

*/

var firstUniqChar = function(s) {

??? var len = s.length,

??????? haxi = {};

??? for(var i=0;i<len;i++){

??????? var sub = haxi[s[i]];

??????? if(sub){

??????????? haxi[s[i]] = ++sub;

??????? }else{

??????????? haxi[s[i]] = 1;

??????? }

??? }

???? for(var i=0;i<len;i++){

??????? if(haxi[s[i]] === 1) {

??????????? return i

??????? }

??? }

??? return -1;

};

Q 38 實(shí)現(xiàn)一個(gè)函數(shù) find(obj, str),滿足:

??????? var obj = {a:{b:{c:1}}};

??????? var obj2 = {d:{e:{f:2}}}

??????? find(obj, 'a.b.c') //返回1

find(obj, 'a.d.c') //返回undefined?

??????? find(obj2, 'd')??? //返回{e:{f:2}}

??????? find(obj2, 'd.e.f') //返回2

??? function find(obj,str){

??????? var arrStr = str.split('.')

??????? var newObj = obj

??????? for(var i=0;i<arrStr.length;i++){

??????????? var temp = newObj[arrStr[i]]

??????????? if(temp){

??????????????? newObj = temp

??????????? }else{

??????????????? return undefined

??????????? }

??????? }

??????? return newObj

??? }

??? var obj = {a:{b:{c:1}}};

??? var obj2 = {d:{e:{f:2}}}

??? console.log(find(obj, 'a.b.c')) //返回1

console.log(find(obj, 'a.d.c')) //返回undefined?

??? console.log(find(obj2, 'd'))?? //返回{e:{f:2}}

??? console.log(find(obj2, 'd.e.f')) //返回2

Q39 把數(shù)值轉(zhuǎn)化為貨幣形式,并保留兩位小數(shù)。

例如:輸入1234567.891,輸出1,234,567.89

??? function int2str (num){

??????? let newNum = num.toFixed(2)

??????? let arr = newNum.toString().split('.')

??????? let strLeft = arr[0],strRight = arr[1]

??????? let str = strLeft.split('').reverse()

??????? for(let i=0;i<str.length;i++){

??????????? if((i+1)%4 === 0){

??????????????? str.splice(i,0,',')

??????????? }

??????? }

??????? str.reverse()

??????? let reg = str.join('') + '.' + strRight

??????? return reg

??? }

??? console.log(int2str(1234567.891))

Q40 JS寫(xiě)一個(gè)方法,傳入一個(gè)數(shù)組,返回該數(shù)組的層深(維度)

如:var arr = [1,[2,3,[4,[5,6,7]],11],[8]]

??? function fo(arr,len){

??????? var flag = false

??????? var arr1= []

??????? for(var i=0;i<arr.length;i++){

??????????? if(!!arr[i].length){

??????????????? for(var j=0;j<arr[i].length;j++){

??????????????????? arr1.push(arr[i][j])

??????????????? }

??????????????? flag = true

??????????? }

??????? }

??????? if(flag){

??????????? len++

??????????? return fo(arr1,len)

??????? }else{

??????????? return len

??????? }

??? }

??? var arr = [1,[2,3,[4,[5,6,7]],11],[8]]

??? console.log(fo(arr,1))


作者:指尖跳動(dòng)

鏈接:https://www.jianshu.com/p/2f38ac50c63a

來(lái)源:簡(jiǎn)書(shū)

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容