昨天下午在公司沒事,動手寫了幾道面試題,我也不是閒的發慌,就是感覺每天寫業務方面的**寫長了,思維不是很侷限,想做下演算法題活躍下思維! 歡迎發表意見和拍磚!
題目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
貪心演算法 在求最優解問題的過程中,依據某種貪心標準,從問題的初始狀態出發,直接去求每一步的最優解,通過若干次的貪心選擇,最終得出整個問題的最優解,這種求解方法就是貪心演算法。從貪心演算法的定義可以看出,貪心演算法不是從整體上考慮問題,它所做出的選擇只是在某種意義上的區域性最優解,而由問題自身的特性...