javascript
剑指offer の 1-10 之javascript实现
1--一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
思想:根據二維數組的結構,從左到右遞增,從上到下遞歸,選擇一個比較適合的切入點,進行數組遍歷,比較。這個選擇的切入點需要滿足,當要查找的數據與它作比較時,有唯一的出路可走,如當要查找的數據大于這個切入點時,下面該往哪里繼續查找,不能同時幾條路都可以選擇,那判斷起來就麻煩了。這里我們以第n行第1列數據為切入點,即二維數組最左下角的元素,這樣當要查找的數據大于該切入點時,直接j++向右進行遍歷,如果要查找的數據小于該切入點時,直接i--向上進行遍歷,否則,那切入點即為要查找的數據,如此循環,直到找到為止。
function Find(target, array) {var row=array.length;if(row==0){return false;}var col=array[0].length;var i=row-1,j=0; //以最后一行第一列為基準while(i>=0&&j<col){?//循環if(array[i][j]<target){ //待查找值大,繼續向右查找j++;}else if(array[i][j]>target){?//待查找值小,向上繼續查找i--;}else{ //找到return true;}}?
2--請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
function replaceSpace(str) {var newstr;newstr=str.replace(/\s/g,"%20"); //正則表達式匹配,替換return newstr; } 或 function replaceSpace(str) {if(str.length==0){return str;}var len=str.length;?//將輸入字符串長度存儲起來var str1=""; //定義一個新的空字符串for(var i=0;i<len;i++){ if(str[i]==' '){ ?//如果讀取到str的空格處,用“%20”賦值到str1str1+="%20";}else{str1+=str[i];//如果讀取到str的非空格處,將str該處的字符賦值給str1}}return str1; //返回str1 }?
?3--輸入一個鏈表,從尾到頭打印鏈表每個節點的值。
思想:新創建一個數組,將鏈表中的數據依次push進數組,然后將數組反轉,并輸出反轉后的數組。
function printListFromTailToHead(head) {var lst=[]; //定義一個數組while(head!=null){ //將鏈表中的元素push進數組lst.push(head.val); //將鏈表的頭指針指向的元素push進數組head=head.next; //指針指向后移}lst.reverse(); //利用reverse()方法將數組顛倒順序return lst; //返回顛倒后的數組 }?
?
5--用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。
思想:將數據push進棧1,將棧1中的數據pop進棧2,將棧2中的數據pop出去。當棧2為空時,再將棧1中的數據pop進棧2,即將棧2中的數據一次性pop完。
?
function Stack(){ //定義棧及棧中方法this.dataStore =[]this.top =0this.psh=pshthis.empty=emptythis.pp=pp}function empty(){ return this.top<=0}function psh(element){this.dataStore[this.top++] = element}function pp(){if(this.empty()){return 0;}return this.dataStore[--this.top]}var stack1 = new Stack() var stack2 = new Stack()function push(node){ //將節點push進棧1中stack1.psh(node)}function pop(){if(stack2.empty()){ //判斷棧2是否為空,當棧2為空時,再將棧1里的數據push進棧2,每次將棧2中的數據全部pop出去while(!stack1.empty()){stack2.psh(stack1.pp())}}return stack2.pp() //返回棧2pop出去的數據}?
?
?
?
6--把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。NOTE:給出的所有元素都大于0,若數組大小為0,請返回0。
思想:元素查找,遍歷
function minNumberInRotateArray(rotateArray) {var len=rotateArray.length;if(len==0){return 0;}else if( len==1){return rotateArray[0];}for(var i=len-1;i>=1;i--){if(rotateArray[i]<rotateArray[i-1]){return rotateArray[i];}}return rotateArray[0]; }?
7--大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。n<=39
思想:遞歸
function Fibonacci(n) {if(n==0){return 0;}var fn=[1,1]; //最開始的兩個數for(var i=2;i<n;i++){fn[i]=fn[i-1]+fn[i-2] //后一個數為前兩個數之和,遞歸}return fn[n-1]; //返回數組的第n個數 }?
8--一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
思想:給出n,第一次有兩種情況,跳2那么剩下f(n-2)種跳法,跳1剩下f(n-1)種跳法,總的是f(n-1)+f(n-2)可以往下一直遞歸。
jumpFloor(number) { functionif(number<=0){return 0;}var jump=[1,2];for(var i=2;i<number;i++){jump[i]=jump[i-1]+jump[i-2];}return jump[number-1]; }?
9--一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
思想:
f(1)=1,f(2)=2,f(3)=1+f(2)+f(1)...
f(3)可以這樣考慮:分跳3(本身值直接+1),跳1,跳2三種情況,跳1之后還剩f(3-1)種跳法,跳2之后
還有f(3-2)種跳法,所以f(3)可以等于這三種分法相加。類推f(n)=1+f(1)+f(2)+...+f(n-1)。
2的n-1次方
function jumpFloorII(number) {if(number <= 0){return 0;}var jump=1;for(var i=1;i<number;i++){jump*=2;}return jump; }或
function jumpFloorII(number) {??
?? if(number<0){
?????? return 0;
?? }
??? return Math.pow(2,number-1);
}
?
10--我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
思想:n=1時,1種情況,n=2時,橫著或豎著覆蓋,兩種情況。n=3時,橫著、豎著、橫豎混著,共3種情況。可以依次遞推。
function rectCover(number) {if(number<=0){return 0;}var Fn=[1,2];for(var i=2;i<number;i++){Fn[i]=Fn[i-1]+Fn[i-2];}return Fn[number-1]; }?
?
?
?
?
?
?
部分參考:https://zhuanlan.zhihu.com/imweb
?
轉載于:https://www.cnblogs.com/haimengqingyuan/p/6917433.html
總結
以上是生活随笔為你收集整理的剑指offer の 1-10 之javascript实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dubbo -- 系统学习 笔记 --
- 下一篇: Hive Cilent数据操作