C++面试题集4
一. 华为一道面试题-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<n+1; i++) /*时间复杂度O(n)*/
{
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<n;counter++) {
pfirst=pfirst->next;
}
psecond=head;
while(pfirst!=NULL) {
pfirst=pfirst->next;
psecond=psecond->next;
}
return psecond;
}
三. VC++学习笔记
1. 日期转成字符串:
COleDateTime ww;
ww=COleDateTime::GetCurrentTime();
AfxMessageBox(ww.Format("%Y-%m-%d %H:%M:%S"));
2. 字符串转成日期:
COleDateTime dt;
dt.ParseDateTime(“2006-08-08 08:08:08”);
3. 资源文件
资源文件名:xxx.rc,其中要包含的主要文件:resource.h和afxres.h
4. vc开发环境没有自动提示时:
删除 目录下的ncb文件 ,再打开一般就ok了
5. 利用_variant_t 取数据库数据的方法:
_variant_t ibb;
ibb=(_variant_t)rs->GetCollect("inta");
if(ibb.vt!=VT_NULL)
{
m_b=ibb.lVal;
}
6. 平时取记录集字段值的方法:
(LPCTSTR)(_bstr_t)rs->GetCollect("datea")
7. DoModal()可以返回两个结果 IDOK,IDCANCEL,他们都是int型,分别是:1,2。通过EndDialog(IDOK)的方式返回。
8. 一般将数据库连接方面的信息放到app中。则AfxGetApp()非常重要,如;
CAdo2App* mapp=(CAdo2App*)AfxGetApp();
Map->conn->Execute(sql,NULL,adCmdText);
9. DECLARE_DYNCREATE(类名),IMPLEMENT_DYNCREATE(类名,基类名) 使得由CObject继承来的类在程序运行的时候能够动态的创建。
10. DECLARE_DYNAMIC(类名),IMPLEMENT_DYNAMIC(类名,基类名) 可以在运行时获得该类的信息
11. DECLARE_SERIAL(类名),IMPLEMENT_SERIAL(类名,基类名,0)为一个可以串行化的CObject派生类产生必要的C++标题代码
12. 获得文档的方法: CMainFrame * pFrame=(CMainFrame *) AfxGetMainWnd();
CPClientDoc * pDoc =(CPClientDoc *) pFrame->GetActiveDocument();
13. 获得视图的方法:CMainFrame * pFrame=(CMainFrame *) AfxGetMainWnd();
myView =(CPClientView*) pFrame->GetActiveView();
14. 如果要引用全局变量或者全局方法,须在当前类中引入:extern 名字;