`
北极的。鱼
  • 浏览: 159023 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】经典面试题

 
阅读更多

转自:http://blog.csdn.net/fanzitao/article/details/7930801

 字符串转化为数字

注意:处理正负号,可以处理正负号,字母打头,-+打头,以及其中字符串中间含有非法字符的情况。
bool change(char *str,int &num)
{
     num = 0;
     int mul = 1;
     if(*str=='-'||*str=='+')
     {
          if(*str=='-')
              mul = -1;
          str++;
          if(*str=='\0')//防止出现”-“,”+”的情况
              return false;
     }
     while(*str!='\0'&&*str>='0'&&*str<='9')//对照0~9在ASCII中的编号
     {
          num = num*10+*str-'0';
          str++;
     }
     if(*str=='\0')
     {
          num = mul*num;
          return true;
     }
     else 
         return false;
}

 说白了,就是取出字符串中每个字符,然后对比其在ASCII中的编号,如果是落在0~9之间,就是对应的数字。然后在开始的时候,要判断下正负。

 

 

有一个整数数组,请求出两两之差绝对值的最小值

#include<iostream>
#include<algorithm>
using namespace std;
int a[] = {-3,4,2,7,25,0,8,-2};
int main()
{
    int len =sizeof(a)/sizeof(int);
    //sort(a,a+len);//排序以后就不是原数组了
    int min =50;
    for(int i=len-1; i>0;i--)
    {
        min = (abs(a[i]-a[i-1])>min)?min:abs(a[i]-a[i-1]);
    }
    cout<<"min "<<min<<endl;
    getchar();
    return 0;
}

 

全排列

首先考虑baccba这二个字符串是如何得出的。显然这二个都是abc中的 a 与后面两字符交换得到的。然后可以将abc的第二个字符和第三个字符交换得到acb。同理可以根据baccba来得bcacab

因此可以知道 全排列就是从第一个数字起每个数分别与它后面的数字交换,也可以得出这种解法每次得到的结果都是正确结果,所以复杂度为 O(n!)。找到这个规律后,递归的代码就很容易写出来了:

static void Main(string[] args)
{
    char[] s = "abc".ToCharArray();
    AllRange(s, 0, 3);
    Console.WriteLine("\n\n总数为{0}", resultcount);

    Console.ReadLine();
}

static int resultcount = 0;
static void Swap(ref char a, ref char b)
{
    char temp = a;
    a = b;
    b = temp;
}
//length 为数组长度
static void AllRange(char[] list, int start, int length)
{
    if (start == length)
    {
        for (int i = 0; i < length; i++)
        {
            Console.Write("{0}", list[i]);
        }
        Console.WriteLine();
        resultcount++;
    }
    else
    {
        for (int i = start; i < length; i++)//从第一个数开始,每个数都和后面的数交换
        {
            Swap(ref list[start], ref list[i]);
            AllRange(list, start + 1, length);
            Swap(ref list[start], ref list[i]);
        }
    }
}

 链表相交问题

转自:http://blog.csdn.net/hackbuteer1/article/details/7583102



 
红色虚线框中的节点为待求节点。

首先使用第2个题目中的快、慢指针来判断链表是否存在环,若不存在结束。
若链表中存在环,我们从链表头、与两个指针的相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇的第一个点为环的入口点。

代码如下:
// 找到环的第一个入口点  
LinkList* FindLoopPort(LinkList *head)  
{  
    LinkList *pslow = head;  
    LinkList *pfast = head;  
    while(pfast != NULL && pfast->next != NULL)  
    {  
        pslow = pslow->next;        // 每次前进一步  
        pfast = pfast->next->next;  // 每次前进二步  
        if(pslow == pfast)          // 两个指针相遇,说明存在环  
            break;  
    }  
    if(pfast == NULL || pfast->next == NULL)    // 不存在环  
        return NULL;  
    pslow = head;  
    while(pslow != pfast)  
    {  
        pslow = pslow->next;        // 每次前进一步  
        pfast = pfast->next;        // 每次前进一步  
    }  
    return pslow;       // 返回环的入口点  
}  
 分析:当pfast若与pslow相遇时,pslow肯定没有走遍历完链表,而pfast已经在环内循环了n圈(1<=n)。假设pslow走了s步,则pfast走了2s步(pfast步数还等于s 加上在环上多转的n圈),设环长为r,则:

2s = s + nr    s= nr
设整个链表长L,入口环与相遇点距离为x,起点到环入口点的距离为a。  

 a+x=s , a+x+nr = 2s 则 a + x = nr  则  a + x = (n – 1)r +r = (n-1)r + L - a   a = (n-1)r + (L – a – x)
(L – a – x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。
小结:链表是数据结构中最基本的,也是面试中常考的,与链表相关的题目也变化多端,只要基础扎实,多积累一些处理类似问题的技巧,面试时便能应对自如。

 

已知先序或后序已经中序,构造二叉树

转自:http://www.cnblogs.com/bmrs/archive/2010/08/19/slovetree.html

这种题一般有二种形式,共同点是都已知中序序列。如果没有中序序列,是无法唯一确定一棵树的,证明略。

一、已知二叉树的前序序列和中序序列,求解树。

1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。

2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点左边和右边都为空,则根节点已经为叶子节点。

3、递归求解树。将左子树和右子树分别看成一棵二叉树,重复1、2、3步,直到所有的节点完成定位。

二、已知二叉树的后序序列和中序序列,求解树。

1、确定树的根。树根是当前树中所有元素在后序遍历中最后出现的元素。

2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点左边和右边都为空,则根节点已经为叶子节点。

3、递归求解树。将左子树和右子树分别看成一棵二叉树,重复1、2、3步,直到所有的节点完成定位。

举例说明:根据已知求解二叉树

中序序列 HLDBEKAFCG
后序序列 LHDKEBFGCA

1、在后序序列LHDKEBFGCA中最后出现的元素为A,HLDBEK|A|FCG
2、在后序序列LHDKEB中最后出现的元素为B,HLD|B|EK|A|FCG
3、在后序序列LHD中最后出现的元素为D,HL|D|B|EK|A|FCG
4、在后序序列LH中最后出现的元素为H,H|L|D|B|EK|A|FCG
5、在后序序列KE中最后出现的元素为E,H|L|D|B|E|K|A|FCG

5、在后序序列FGC中最后出现的元素为C,H|L|D|B|E|K|A|F|C|G
6、所有元素都已经定位,二叉树求解完成。

A
              /     \
             B       C
            / \     /  \
           D  E     F   G
          /    \
         H      K                    
          \                         
           L                     

 

代码如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  1 /*
    功能: 1.利用树的前序和中序序列创建树
          2.利用树的后序和中序序列创建树
*/
#include <iostream>
#include <cstring>
using namespace std;

char pre[50] = "ABDHLEKCFG";        //前序序列
char mid[50] = "HLDBEKAFCG";        //中序序列
char post[50] = "LHDKEBFGCA";        //后序序列

typedef struct _Node
{
    char v;
    struct _Node *left;
    struct _Node *right;
}Node, *PNode;

void PostTravelTree(PNode pn);        //树的后序递归遍历
void PreTravelTree(PNode pn);        //树的前序递归遍历
void PreMidCreateTree(PNode &pn, int i, int j, int len);        //利用前序中序序列创建树
void PostMidCreateTree(PNode &pn, int i, int j, int len);        //利用后序中序序列创建树
int Position(char c);                //确定c在中序序列mid中的下标,假设树的各个节点的值各不相同


int main() 
{ 
    PNode root1 = NULL, root2= NULL;

    PreMidCreateTree(root1, 0, 0, strlen(mid));
    PostTravelTree(root1); cout<<endl;    
    PostMidCreateTree(root2, strlen(post)-1, 0, strlen(mid));
    PreTravelTree(root2); cout<<endl;    

    return 0;
}


int Position(char c)
{
    return strchr(mid,c)-mid;
}


/*  利用前序中序序列创建树,参考了http://hi.baidu.com/sulipol/blog/item/f01a20011dcce31a738b6524.html
 *的实现,代码十分简洁,竟然只有短短的"令人发指"的8行,递归实在太彪悍了!!!!!!!!!!!!!!!!!!!!!
 *        i: 子树的前序序列字符串的首字符在pre[]中的下标
 *        j: 子树的中序序列字符串的首字符在mid[]中的下标
 *      len: 子树的字符串序列的长度
 */
void PreMidCreateTree(PNode &pn, int i, int j, int len)
{
    if(len <= 0)
        return;
    
    pn = new Node;
    pn->v = pre[i];
    int m = Position(pre[i]);//先序首字符在中序中的位置
    PreMidCreateTree(pn->left, i+1, j, m-j);//i+1为当前结点在先序中的位置,j为中序的开始结点位置,m-j为中序里左子树字符串长度
    PreMidCreateTree(pn->right, i+(m-j)+1, m+1, len-1-(m-j));//len-1-(m-j)为右子树字符串长度
}


/*  利用后序中序序列创建树
 *        i: 子树的后序序列字符串的尾字符在post[]中的下标
 *        j: 子树的中序序列字符串的首字符在mid[]中的下标
 *      len: 子树的字符串序列的长度
 */
void PostMidCreateTree(PNode &pn, int i, int j, int len)
{
    if(len <= 0)
        return;

    pn = new Node;
    pn->v = post[i];
    int m = Position(post[i]);//后序首字符在中序中的位置
    PostMidCreateTree(pn->left, i-1-(len-1-(m-j)), j, m-j);//注意参数:m-j左子树的长度,len-1-(m-j)右子树的长度
    PostMidCreateTree(pn->right, i-1, m+1, len-1-(m-j));
}


void PostTravelTree(PNode pn)        //后序递归遍历
{
    if(pn)
    {
        PostTravelTree(pn->left);    
        PostTravelTree(pn->right);
        cout<<pn->v<<" ";
    }
}


void PreTravelTree(PNode pn)        //前序递归遍历
{
    if(pn)
    {
        cout<<pn->v<<" ";
        PreTravelTree(pn->left);    
        PreTravelTree(pn->right);
    }
}
 
  • 大小: 9.9 KB
分享到:
评论

相关推荐

    各公司经典面试题选取

    ### 各公司经典面试题选取知识点总结 #### 一、面试题目的背景及意义 面试题目不仅是考察应聘者的基础知识掌握程度,更重要的是通过这些问题来评估求职者的逻辑思维能力、解决问题的能力以及团队合作精神。本篇...

    120个Java经典面试题和答案

    以下是一些基于标题和描述中提到的Java经典面试题及对应的知识点详解: 1. **Java基础** - **数据类型**:Java有8种基本数据类型,了解它们的存储大小和范围,以及如何进行类型转换。 - **变量与常量**:理解变量...

    前端75道经典面试题.rar

    "前端75道经典面试题.rar"这个压缩包提供了互联网大厂常问的75道前端面试题,覆盖了基础到进阶的多个层面,是提升你面试能力的理想资料。以下是一些可能包含在这些面试题中的关键知识点: 1. **HTML与CSS**: - ...

    java绝对经典面试题

    根据给定文件的信息,我们可以总结出以下详细的Java知识点: ### 面向对象的四大特性 1. **抽象** - 抽象是面向对象编程的核心概念之一,它指的是从现实世界的事物中提取出共同的、本质的特性,而忽略非本质的、...

    C++相关高频经典面试题100问.pdf

    ### C++相关高频经典面试题知识点详解 #### 1. C++中的数据类型 - **基本数据类型**:包括整型(int, short, long, long long)、浮点型(float, double)、字符型(char)等。 - **复合数据类型**:如数组(array)、...

    php经典面试题及答案

    以下是对提供的面试题的详细解释: 1. **表单提交GET和POST的区别**: - GET方法将表单数据附加到URL中,以键值对的形式显示在地址栏,对数据量有限制,通常不超过2KB。 - POST方法则将数据隐藏在HTTP请求体中,...

    LINUX内核经典面试题

    【Linux内核经典面试题详解】 1. Linux内核锁:Linux内核中主要有自旋锁和信号量两种锁机制。自旋锁用于保护短暂的、不会引起阻塞的临界区,而信号量则允许任务在无法获取锁时进入睡眠状态,适合处理可能长时间持有...

    j2EE 经典面试题

    本篇将围绕"J2EE经典面试题"这一主题,深入探讨相关知识点,帮助你应对各种面试挑战。 1. **Java基础** - **数据类型与变量**:理解基本数据类型及其用法,以及引用数据类型的内存管理。 - **类与对象**:掌握...

    Java经典面试题.pdf.rar

    以下是对"Java经典面试题.pdf"中可能包含的一些关键知识点的详细解释: 1. **基础语法**:面试中可能会考察Java的基础概念,如数据类型(基本类型与引用类型)、变量、运算符、流程控制语句(if-else、switch、for...

    java经典面试题(典藏版)

    以下是一些Java经典面试题所涉及的知识点详解: 1. **基本语法与数据类型** - 理解不同数据类型(如int, double, boolean, char等)及其用法。 - 掌握变量声明、赋值和操作符的使用。 - 了解字符串(String)类的...

    Objective-C经典面试题

    本次整理的“Objective-C经典面试题”中的知识点,主要针对C语言中的指针概念、Objective-C语言的数组和指针操作、宏定义及使用、预处理器指令的应用、内存分配与释放、以及Objective-C中委托(Delegation)和字符串...

    10万字208道Java经典面试题总结(附答案).pdf

    这份10万字的PDF文档包含了208道Java经典面试题,旨在帮助开发者们系统地复习和提升自己的技能,以应对包括阿里、腾讯、字节跳动、京东等知名互联网公司的面试。以下是部分题目及其涉及的知识点: 1. **JDK和JRE的...

    java100道经典面试题

    这100道经典Java面试题涵盖了广泛的Java应用和知识点,旨在帮助求职者准备技术面试,同时也是开发者自我提升的良好资源。以下是一些关键的知识点,它们可能出现在这些面试题中: 1. **基础语法**:包括变量、数据...

    嵌入式经典面试题PDF

    面试中,面试官可能会考察候选人的基础知识,包括编程语言特性、内存管理、数据处理以及软硬件交互等方面。以下是对给定内容中涉及的一些关键知识点的详细解释: 1. **#define 宏**:预处理器指令,用于文本替换。`...

    C++/MFC经典面试题

    C++/MFC经典面试题 本文档提供了C++/MFC经典面试题,涵盖了C++语言基础知识、MFC框架应用、数据类型、运算符、指针、函数、面向对象编程、多线程编程等多方面的内容。这些问题可以帮助开发者检查自己的知识水平,找...

    java经典面试题(pdf)

    这份“java经典面试题(pdf)”文档无疑为准备Java面试的开发者提供了宝贵的学习资源。 首先,基础语法部分通常会涉及变量、数据类型、运算符、流程控制语句(如if-else、switch、for、while等)、方法定义与调用,...

    200个Java经典面试题总结附带答案.docx

    Java经典面试题总结附带答案 以下是从给定文件中生成的相关知识点: Java基础 1. JDK 和 JRE 的区别是什么?(JDK 是 Java Development Kit,JRE 是 Java Runtime Environment) 2. `==` 和 `equals` 的区别是...

    嵌入式工程师经典面试题.pdf

    嵌入式工程师经典面试题 本文将对嵌入式工程师经典面试题进行总结,涵盖预处理器、宏定义、死循环、数据声明等多个方面的知识点。 1. 预处理器(Preprocessor) 预处理器是C语言编译过程中的一个关键步骤。预...

    ES6经典面试题.docx

    "ES6经典面试题" ES6(ECMAScript 6)是JavaScript的一种标准,自2015年发布以来,已经成为前端开发的 industry standard。下面是对ES6的一些经典面试题的解答和知识点总结: 1. ES5、ES6 和 ES2015 有什么区别? ...

Global site tag (gtag.js) - Google Analytics