日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列

發(fā)布時間:2024/9/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?一、構(gòu)建乘積數(shù)組:

1、題目:

給定一個數(shù)組A[0,1,...,n-1],請構(gòu)建一個數(shù)組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

2、解題思路:

參考牛客網(wǎng)的“披薩大叔”:https://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46

B[i]的值可以看作下圖的矩陣中每行的乘積。

下三角用連乘可以很容求得,上三角,從下向上也是連乘。

因此我們的思路就很清晰了,先算下三角中的連乘,即我們先算出B[i]中的一部分,然后倒過來按上三角中的分布規(guī)律,把另一部分也乘進去。

3、代碼實現(xiàn):

public class Test7 {public int[] multiply(int[] A) {int length= A.length;int[] B = new int[length];if(length!=0){B[0]=1;//計算下三角連乘for(int i = 1;i<length;i++){B[i]=B[i-1]*A[i-1];}int temp=1;//計算上三角連乘for(int j=length-2;j>=0;j--){temp=temp*A[j+1];B[j]=B[j]*temp;}}return B;} }

?

?

二、求1+2+3+...+n

1、題目:

1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關(guān)鍵字及條件判斷語句(A?B:C)。

2、解題思路:

利用&&的短路特性,&&就是邏輯與,邏輯與有個短路特點,前面為假,后面不計算。

3、代碼實現(xiàn):

public class Solution {public int Sum_Solution(int n) {//利用&&的短路特性,&&就是邏輯與,邏輯與有個短路特點,前面為假,后面不計算。boolean result=true;int sum =0;result=(n>0) && ((sum=Sum_Solution(n-1))>0);sum=sum+n;return sum;} }

?

?

三、不用加減乘除做加法:

1、題目:

寫一個函數(shù),求兩個整數(shù)之和,要求在函數(shù)體內(nèi)不得使用+、-、*、/四則運算符號。

2、解題思路:

首先看十進制是如何做的: 5+7=12,三步走:

第一步:相加各位的值,不算進位,得到2。

第二步:計算進位值,得到10. 如果這一步的進位值為0,那么第一步得到的值就是最終結(jié)果。

第三步:重復(fù)上述兩步,只是相加的值變成上述兩步的得到的結(jié)果2和10,得到12。

同樣我們可以用三步走的方式計算二進制值相加: 5-101,7-111 第一步:相加各位的值,不算進位,得到010,二進制每位相加就相當(dāng)于各位做異或操作,101^111。

第二步:計算進位值,得到1010,相當(dāng)于各位做與操作得到101,再向左移一位得到1010,(101&111)<<1。

第三步重復(fù)上述兩步, 各位相加 010^1010=1000,進位值為100=(010&1010)<<1。
? ? ?繼續(xù)重復(fù)上述兩步:1000^100 = 1100,進位值為0,跳出循環(huán),1100為最終結(jié)果。

3、代碼實現(xiàn):

public class Test25 {public int Add(int num1,int num2) {while(num2!=0){int temp=num1^num2;num2=(num1&num2)<<1;num1 = temp;}return num1;} }

?

?

四、包含min函數(shù)的棧:

1、題目:

定義棧的數(shù)據(jù)結(jié)構(gòu),請在該類型中實現(xiàn)一個能夠得到棧中所含最小元素的min函數(shù)(時間復(fù)雜度應(yīng)為O(1))。

2、第一種解題思路:

借助輔助棧存儲min的大小,自定義棧結(jié)構(gòu)
? ? list ?3,4,2,5,1
? ? 輔助棧 3,3,2,2,1
每入棧一次,就與輔助棧頂比較大小,如果小就入棧,如果大就入棧當(dāng)前的輔助棧的棧頂元素;
當(dāng)出棧時,輔助棧也要出棧,這種做法可以保證輔助棧頂一定都當(dāng)前棧的最小值

代碼實現(xiàn):

public class Test7 {private int size;//數(shù)組容量private int min=Integer.MAX_VALUE;//最小元素private Stack<Integer> minStack = new Stack<Integer>();//輔助棧private Integer[] elements = new Integer[10];//數(shù)據(jù)入棧,每入棧一次,就與輔助棧頂比較大小,如果小就入棧,如果大就入棧當(dāng)前的輔助棧的棧頂元素。public void push(int node){ensureCapacity(size+1);elements[size++]= node;if(node<=min){minStack.push(node);min=minStack.peek();}else{minStack.push(min);}}//數(shù)組擴容private void ensureCapacity(int i) {int len=elements.length;if(size>len){int newLen =(len*3)/2+1;//每次擴容的方式elements=Arrays.copyOf(elements, newLen);}}//元素出棧,當(dāng)出棧時,輔助棧也要出棧,保證輔助棧頂一定都當(dāng)前棧的最小值private void pop(){Integer top=top();if(top!=null){elements[size-1] =(Integer)null;}size--;minStack.pop();min=minStack.peek();}public int top(){if(!empty()){if(size-1>=0){return elements[size-1];}}return (Integer)null;}public boolean empty(){return size == 0;}public int min(){return min;} }

3、第二種解題思路:

每次入棧2個元素,一個是入棧的元素本身,一個是當(dāng)前棧元素的最小值。 ?如:入棧序列為2-3-1,則入棧后棧中元素序列為:2-2-3-2-1-1 * 用空間代價來換取時間代價:

代碼實現(xiàn):

import java.util.Stack; import java.util.Arrays;public class Solution {private Stack<Integer> stack = new Stack<Integer>();public void push(int node) {if(stack.isEmpty()){stack.push(node);stack.push(node);}else{int temp = stack.peek();stack.push(node);if(temp<node){stack.push(temp);}else{stack.push(node);}}}public void pop() {stack.pop();stack.pop();}public int top() {return stack.get(stack.size()-2);}public int min() {return stack.peek();} }

?

五、用兩個棧實現(xiàn)隊列:

1、題目描述:

兩個棧來實現(xiàn)一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。

2、思路分析:

入隊:將元素進棧A

出隊:判斷棧B是否為空,如果為空,則將棧A中所有元素pop,并push進棧B,棧B出棧;如果不為空,棧B直接出棧。

3、代碼實現(xiàn):

public class Solution{Stack<Integer> stack1 = new Stack<Integer>();Stack<Integer> stack2 = new Stack<Integer>();public void push(int node) {stack1.push(node);}public int pop() {if(stack2.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}}return stack2.pop();} }

?

?

總結(jié)

以上是生活随笔為你收集整理的《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。