1.鏈表和數組的區別在哪裏?
2.編寫實現鏈表排序的一種算法。說明爲什麼你會選擇用這樣的方法?
3.編寫實現數組排序的一種算法。說明爲什麼你會選擇用這樣的方法?
4.請編寫能直接實現strstr()函數功能的代碼。
5.編寫反轉字符串的程序,要求優化速度、優化空間。
6.在鏈表裏如何發現循環鏈接?
7.給出洗牌的一個算法,並將洗好的牌存儲在一個整形數組裏。
8.寫一個函數,檢查字符是否是整數,如果是,返回其整數值。(或者:怎樣只用4行代碼編寫出一個從字符串到長整形的函數?)
9.給出一個函數來輸出一個字符串的所有排列。
10.請編寫實現malloc()內存分配函數功能一樣的代碼。
11.給出一個函數來複制兩個字符串A和B。字符串A的後幾個字節和字符串B的前幾個字節重疊。
12.怎樣編寫一個程序,把一個有序整數數組放到二叉樹中?
13.怎樣從頂部開始逐層打印二叉樹結點數據?請編程。
14.怎樣把一個鏈表掉個順序(也就是反序,注意鏈表的邊界條件並考慮空鏈表)?
給一個字符串、例如 “ababc”要求返回“ab”,因爲“ab”連續重複出現且最長。 用C/C++語言寫一函數完成該算法,給出複雜度
int totalLen;
totalLen = strlen(str); //取得整個字符串的長度。
int index; //從左到右掃描到的索引值.
char * tmpstr; //用來保存臨時的連續重複出現的字符串.
int startIndex = 0;
int maxlen = 0;
char *maxstr; //保存最長的連續重複出現的字符串.
/*
先從最左的開始,一個一個字符地掃描,設掃到的index爲index.
在掃描到的字符及其右邊的所有字符裏查找最長的連續出現的字符串.
具體方法是:
1.取得這些字符串的長度,除以2,得到可能的重複字符串的最長長度.
2. 判斷substr(index,index+len)和substr(index+len,index+len+len)是不是一樣,是的話返回substr(index,index+len);
3.不是則len-1,重複第2步直到len = 0;
4.index 加一,重複第1步.
例如有"cababc",則:
totalLen = 6;index = 0;
現在從左開始
當index = 0 時,在"cababc"裏找,len = totalLen/2 = 3;
1.cab != abc len --;
2.ca != ba len --;
3.c != a len --;
index ++; 則現在在"ababc"裏查找
ab == ab 返回"ab",保存在tmpstr和maxstr裏
index ++ ;則現在在"baba"裏查找
...
...
找不到...
若是以後查到也有連續出現的字符串,則先保存在tmpstr裏,然後長度與maxstr的長度比較,若是長度大於maxstr,則maxstr = tmpstr;
返回maxstr即可.
char * GetRepeatLongestSuhStr(char * str)
{
int index, startIndex, i;
int sublen, totalLen, maxlen;
char *tmpstr, *maxstr;
startIndex=0;
totalLen=strlen(str);
maxlen = 0;
for(index=0; index<totalLen; index++)
{
sublen = (totalLen - index)/2;
printf("/tsublen=%d",sublen);
for( ;sublen > 0 ;sublen --)
{
int tmp = 0;
while((str[index + tmp] == str[index+sublen+tmp]) && (tmp < sublen))
tmp++;
if(tmp > 0)
if(tmp > maxlen)
{
maxlen = tmp;
startIndex = index;
}
}
}
if(maxlen > 0 )
{
maxstr =(char *)malloc(maxlen+1);
for(i = 0 ;i < maxlen ;i ++)
maxstr[i] = str[startIndex+i];
maxstr[maxlen] = '/0';
return maxstr;
}
return NULL;
}
void main()
{
char * tmp = "eabcdabcdb";
char * str = GetRepeatLongestSuhStr(tmp);
printf("/t%s/n",str);
}