判斷一個鏈表是否存在環
例如
設置兩個指針p
struct link
{
int data;
link* next;
};
bool IsLoop(link* head)
{
link* p
if (head ==NULL || head
{
return false;
}
do{
p
p
} while(p
if(p
return true;
else
return false;
}
單向鏈表的反轉是一個經常被問到的一個面試題
例如
struct linka {
int data;
linka* next;
};
void reverse(linka*
{
if(head ==NULL)
return;
linka*pre
pre=head;
cur=head
while(cur)
{
ne = cur
cur
pre = cur;
cur = ne;
}
head
head = pre;
}
還有一種利用遞歸的方法
linka* reverse(linka* p
{
if(p == NULL || p
{
head=p;
return p;
}
else
{
linka* tmp = reverse(p
tmp
return p;
}
}
給定兩個排好序的數組
這個問題首先想到的是一個O(nlogn)的算法
bool findcommon(int a[]
{
int i;
for(i=
{
int start=
while(start<=end)
{
mid=(start+end)/
if(a[i]==b[mid])
return true;
else if (a[i]
end=mid
else
start=mid+
}
}
return false;
}
後來發現有一個 O(n)算法
bool findcommon
{
int i=
while(i
{
if(a[i]==b[j])
return true;
if(a[i]>b[j])
j++;
if(a[i]
i++;
}
return false;
}
給定一整數序列A
例如
對於這個問題
int max_sub(int a[]
{
int i
for(i=
v=
for(j=i;j
v=v+a[j];//Sum(i
if(v>max)
max=v;
}
}
return max;
}
那怎樣才能達到線性復雜度呢?這裡運用動態規劃的思想
int max_sub
{
int i
for(i=
temp_sum+=a[i];
if(temp_sum>max)
max=temp_sum;
else if(temp_sum<
temp_sum=
}
return max;
}
並不是簡單的字符串反轉
例如
經過反轉後變為
is Here
如果只是簡單的將所有字符串翻轉的話
char* reverse_word(const char* str)
{
int len = strlen(str);
char* restr = new char[len+
strcpy(restr
int i
for(i=
{
char temp=restr[i];
restr[i]=restr[j];
restr[j]=temp;
}
int k=
while(k
i=j=k;
while(restr[j]!=
j++;
k=j+
j
for(;i
{
char temp=restr[i];
restr[i]=restr[j];
restr[j]=temp;
}
}
return restr;
}
如果考慮空間和時間的優化的話
例如將
char temp=restr[i];
restr[i]=restr[j];
restr[j]=temp;
改為
restr[i]^=restr[j];
restr[j]^=restr[i];
restr[i]^=restr[j];
一個動態長度可變的數字序列
例如
#include
#include
using namespace std;
//remove the duplicated numbers in an intger array
//e
void static remove_duplicated(int a[]
{
_st
for(int i=
{
if(a[i
_st
}
}
當然如果可以改變原來的數組的話
void static remove_duplicated
{
if(a[
return;
int insert=
while(a[current]!=
{
if(a[current]!=a[current
{
a[insert]=a[current];
insert++;
current++;
}
else
current++;
}
a[insert]=
}
判斷一個二叉排序樹是否是平衡二叉樹 解決方案
首先編寫一個計算二叉樹深度的函數
template
static int Depth(BSTreeNode
{
if (pbs==NULL)
return
else
{
int ld = Depth(pbs
int rd = Depth(pbs
return
}
}
下面是利用遞歸判斷左右子樹的深度是否相差
template
static bool isBalance(BSTreeNode
{
if (pbs==NULL)
return true;
int dis = Depth(pbs
if (dis>
return false;
else
return isBalance(pbs
}
From:http://tw.wingwit.com/Article/program/sjjg/201405/30935.html