Chinaunix首页 | 论坛 | 博客
  • 博客访问: 152047
  • 博文数量: 64
  • 博客积分: 2545
  • 博客等级: 少校
  • 技术积分: 692
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-22 20:00
文章分类

全部博文(64)

文章存档

2011年(3)

2009年(51)

2008年(10)

我的朋友

分类: C/C++

2009-06-27 11:50:37

一. 华为一道面试题-1-n排序

有N个大小不等的自然数(1--N),请将它们由小到大排序。
要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。

网上转的,一开始也没有注意到最开始的半句。

算法:N个不等的自然数1~N,排序完成后必然为1~N。所以可以一次遍历,遇到a[i]!=i的就把a[i]和a[a[i]]交换。

void sort(int a[], int n)
{
 int i;
 int t; /*临时变量:空间复杂度O(1)*/

 for (i=1; i {
 while(a[i]!=i)
  {
 t = a[a[i]];
 a[a[i]] = a[i];//排好一个元素
 a[i] = t;
  }
 }
}

二. 一次遍历 找 链表倒数第n个节点

 一道面试题目,阿明和晨晨看到并且告诉我答案的。要求通过一次遍历找到链表中倒数第n个节点,链表可能相当大,可使用辅助空间,但是辅助空间的数目必须固定,不能和n有关。
算法思想:两根指针,第一根先出发,相距n步后第二根出发。然后同时步进,直到第一根指针达到末尾。

struct iNode {
int value;
iNode * next;
};
iNode * getresult(iNode * head,int n)
{

iNode *pfirst;
iNode *psecond;

pfirst=head;
int counter;

for(counter=0;counter pfirst=pfirst->next;
}

psecond=head;

while(pfirst!=NULL) {
 pfirst=pfirst->next;
 psecond=psecond->next;
}

return psecond;

}


 原文地址 http://blog.csdn.net/mobidogs/archive/2007/01/11/1480120.aspx
阅读(373) | 评论(0) | 转发(0) |
0

上一篇:interview C/C++6

下一篇:interview C/C++8

给主人留下些什么吧!~~