javascript劍指offer程式設計練習 4

2021-09-02 23:21:26 字數 4380 閱讀 2336

題目描述

從上往下列印出二叉樹的每個節點,同層節點從左至右列印。

/* function treenode(x)  */

function

printfromtoptobottom

(root)

let queue=

queue.

push

(root)

let result=

while

(queue.length)

if(node.right)

}return result

}

二叉樹的層次遍歷,也就是bfs廣度優先搜尋,借助乙個佇列,儲存二叉樹。

題目描述

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。

function

verifysquenceofbst

(sequence)

return

adjustsquence

(sequence,

0,sequence.length-1)

}function

adjustsquence

(squence,start,end)

let i=start

while

(i)for

(let j=i;j

return

adjustsquence

(squence,start,i-1)

&&adjustsquence

(squence,i,end-1)

}

主要要搞清楚後序遍歷結果是什麼樣子,result為後序遍歷結尾,去除結尾最後乙個元素為x,剩餘陣列可分為左右兩部分,一部分全部小於x,另一部分全部大於x,例如[5,8,7,10,13,12,9]就是乙個後序比那裡結果。去除9後,[5,7,8]全部小於9,[10,13,12]全部大於9,利用bst二叉樹搜尋樹演算法進行遞迴

題目描述

輸入一顆二叉樹的跟節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前)

/* function treenode(x)  */

function

findpath

(root, expectnumber)

dfs(root,0)

return result

function

dfs(root,sum)

stack.

push

(root.val)

sum+=root.val

if(!root.left&&

!root.right&&sum==expectnumber)

if(root.left)

if(root.right)

stack.

pop()}

}

dfs深度優先搜尋

題目描述

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

/*function randomlistnode(x)*/

function

clone

(phead)

var head=

newrandomlistnode

(phead.label)

head.random=phead.random

head.next=

clone

(phead.next)

return head

}

題目描述

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

/* function treenode(x)  */

function

convert

(prootoftree)if(

!prootoftree)

var lastnode =

null

; lastnode =

convertnode

(prootoftree)

;var head = lastnode;

while

(head && head.left)

return head;

function

convertnode

(node)

if(node.left)

node.left = lastnode;

if(lastnode)

lastnode = node;

if(node.right)

return lastnode;

}}

題目描述

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

輸入描述:

輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

function

permutation

(str)

let result=

let temp=

''let arr=str.

split(''

)sort

(arr)

result=result.

filter

(function

(item,index)

)function

sort

(arr)

for(

let i=

0;ireturn result

}

利用回溯法進行暴力搜尋,遍歷出所有結果

題目描述

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

function

morethanhalfnum_solution

(numbers)

let arr=

let len=numbers.length

numbers.

foreach

((item,index)

=>

)for

(var i =

0; i < arr.length; i++)}

return

0

新建乙個陣列,陣列的每項的key為元素值,value為元素個數

題目描述

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

function

getleastnumbers_solution

(input, k)

return input.

sort

((a,b)

=>).

slice(0

,k)}

題目描述

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)

function

findgreatestsumofsubarray

(array)

let max=array[0]

let result=array[0]

for(

let i=

1;i)return result

}

利用動態規劃法拆分成子問題:

f(i):以array[i]為末尾元素的子元素和的最大值

f(i)=max(f(i-1)+array[i] , array[i])

res:所有子陣列的和的最大值

res=max(res,f(i))

劍指off 列印1到n

題目 輸出 1到n。焦點在於如果n很大,超過32位或者64位,這基本上無法表示 解決的辦法是用字串模擬加法,但是如何模擬,如何控制迴圈呢?memset char number,int ch,int n 作用將number前n個位置用ascii碼代替memset a,0,sizeof a 用memse...

劍指off 複製複雜鍊錶

題目 鍊錶的結構中多了乙個spring指標,這個指標可能指向鍊錶中的任何乙個節點,複製這個複雜鍊錶。分析 首先想到的是第一種方法,複製next串聯起來的鍊錶,然後複製spring 指標,但是每次都要從頭順序查詢spring指標在副本中的值,那麼這個效率應該是o n 2 第二種方法是將副本建立在原來的...

劍指off 表示數值的字串

請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。思路 主要是判斷條件的處理 邊界的處理 coding utf 8 class solution...