5道經典的程式題 演算法設計與分析

2021-09-06 04:15:11 字數 3888 閱讀 6735

昨天下午在公司沒事,動手寫了幾道面試題,我也不是閒的發慌,就是感覺每天寫業務方面的**寫長了,思維不是很侷限,想做下演算法題活躍下思維! 歡迎發表意見和拍磚!

題目1輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o(n)。

例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2,因此輸出為該子陣列的和18。

view code

//////

獲得陣列最大子陣列的和

///

///整形 陣列

///最大子陣列的和

public

static

intgetmaxchild(

int intarr)

intresult =0

; //

最大和int

tempsum =0

; //

累加和int

maxnegative

=intarr[

0];

//陣列最大值

for(

inti =0

; i

<

intarr.length; i++)

else

if(tempsum

>

result)

if(intarr[i]

>

maxnegative)}if

(maxnegative

<0)

return

result;}

題目2輸入n個整數,輸出其中最小的k個。

例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。

解:view code

//////

輸入n個整數,輸出其中最小的k個。

///

///

///

public

static

list

<

int>

getmincountnumber(

int array,

intfindcount)

if(array

==null

||array.length

<

findcount)

#region

排序int

temp;

//臨時變數,儲存最大,小值

for(

intj =0

; j

<

array.length; j++)

}}#endregion

//返回最小的k個

list

<

int>

intlist

=new

list

<

int>

();for

(inti =

0; i

<

findcount; i++)

return

intlist;}

題目3輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。

例如輸入「i am a student.」,則輸出「student. a am i」。

思路:把字串按空格分割成陣列,然後倒序拼接輸出

但是:出題人的意圖是不讓你用string裡的方法分割拼接。最後我只能自己想辦法反轉了,如果不用string裡的方法有點小複雜!

view code

//////

反轉字串順序

///

///

///

public

static

string

getstrreverse(

string

str)

//全部反轉

stringbuilder currentstr

=new

stringbuilder(str.length);

for(

inti

=str.length -1

; i

>=

0; i

--#region

單詞順序復原

char

tempchar;

intindexbegin =0

;int

indexend =0

;for

(inti =

0; i

<

currentstr.length; i++)

indexbegin =i

+1;//

跳過空格

}else

if(currentstr[i] =='

!'||currentstr[i] =='

,'||currentstr[i] =='

.'||currentstr[i] =='

;'||currentstr[i] =='

?')}

#endregion

return

currentstr.tostring();}

題目4求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字以及條件判斷語句(a?b:c)。

解:這個好像有點複雜,好像說的什麼都不能用一樣,這道題想了蠻久但**很簡單!

view code

//////

返回階加結果(內部沒有驗證輸入引數)

///

///階加長度

///返回結果

///

public

static

bool

getintsum(

intn,

refint

sum)

題目5輸入乙個已經按公升序排序過的陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。

思路:找到陣列的第乙個數字和最後乙個數字。當兩個數字的和大於輸入的數字時,把較大的數字往前移動;當兩個數字的和小於數字時,把較小的數字往後移動;當相等時,輸出等式

view code

//////

在排序陣列中查詢和為給定值的兩個數字

///

///輸入陣列(要求已排序)

///指定和

public

static

dictionary

<

int,

int>

findtwonumberswithsum(

int array,

intsum)

if(sum

<1)

dictionary

<

int,

int>

dicintarray

=new

dictionary

<

int,

int>

();int

indexbegin =0

;int

indexend

=array.length -1

;while

(indexend

>

indexbegin)

else

if(currentsum

>

sum)

indexend--;

else

indexbegin++;

}return

dicintarray;}

演算法設計與分析 上機題Mergesort

include using namespace std define n 100 int g array n 存放輸入的數字 static int count 存放元素的個數 初始化函式 void initial 合併函式 void merge int a,int l,int m,int r els...

演算法設計與分析 上機題Mergesort

include using namespace std define n 100 int g array n 存放輸入的數字 static int count 存放元素的個數 初始化函式 void initial 合併函式 void merge int a,int l,int m,int r els...

演算法分析與設計學習筆記 5

貪心演算法 在求最優解問題的過程中,依據某種貪心標準,從問題的初始狀態出發,直接去求每一步的最優解,通過若干次的貪心選擇,最終得出整個問題的最優解,這種求解方法就是貪心演算法。從貪心演算法的定義可以看出,貪心演算法不是從整體上考慮問題,它所做出的選擇只是在某種意義上的區域性最優解,而由問題自身的特性...