1.汉诺塔-递归问题
int i=1;//记录步数
void move(int n,char from,char to) {
printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to);
}
void hanoi(int n,char from,char denpend_on,char to) {
if (n==1)
move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地
else {
hanoi(n-1,from,to,denpend_on);
move(n,from,to);
hanoi(n-1,denpend_on,from,to);
}
bool judge(LinkList head){
LNode *q=head;
LNode *p=head->next;
int num=2;
while(p){
if(p->data!=num*num*q->data)
return false;
q=p;
p=p->next;
}
return true;
}
3.假定数组A[0,…,n-1]中有多个零元素,试写一个函数,将A中所有的非零元素依次移到数组A的前端,要求空间复杂度为O(1)。
void MoveNumZeroLeft(int A[],int n){
int i=0,j=n-1;
while(i<j){
while(A[i]!=0&&i<j) i++;
while(A[j]==0&&i<j) j--;
if(i<j) Swap(A[i],A[j]);
}
}
4.已知一个带头节点的单链表,设该链表只给出了头指针head。在不改变链表结构的前提下,设计一个尽可能高效的算法,查找链表中倒数第K个位置上的节点。若查找成功,则返回该节点中元素值,否则返回-1。(只能通过一次遍历)。
LNode * FindKthToTail(LinkList L,int k){
LNode *p=L->head;
LNode *q=NULL;
for(int i=0;i<k-1;i++)
p=p->next;
q=L->head;
while(q->next){
p=p->next;
q=q->next;
}
return q;
}
5.将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间上尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1,…,Xn-1)变换成为(Xp,Xp+1,…,X0,X1,…,Xp-1)。
void Converse(int R[],int n,int p){ //R为数组,n为长度,p为要左循环多少个
Reverse(R,0,p-1);
Reverse(R,p,n-1);
Reverse(R,0,n-1);
}
void Reverse(int R[],int from,int to){
for(int i=0;i<(to-from+1)/2;i++)
Swap(R[from+i],R[to-i]);
}
void DecToBin(int N){
int i;
Stack S;
while(N!=0){
i=N%2;
N=N/2;
Push(S,i);
}
while(IsEmpty(S))
printf(“%d”,Pop(S));
}