程序员面试题
文章平均质量分 74
Sandeldeng
这个作者很懒,什么都没留下…
展开
-
剑指Offer(面试题6~7)
面试题6:重建二叉树 题目:输入某二叉树的前序和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。假如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryT原创 2016-11-04 10:49:14 · 344 阅读 · 0 评论 -
剑指Offer(面试题31~32)
面试题31:连续子数组的最大和题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。bool g_InvalidInput = false;int FindGreatestSumOfSubArray(int *pData,int nLength){ if((pData == NULL) || (nLen原创 2016-11-05 23:54:52 · 449 阅读 · 0 评论 -
剑指Offer(面试题33~34)
面试题33:把数组排成最小的数题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323。 分析:一个非常直观的解决大数问题的方法就是把数字转换成字符串。另外,由于把数字m和n拼接起来得到mn和nm,它们的位数肯定是相同的,因此比较它们的大小只需要按照字符串大小的比较规则就可以了原创 2016-11-06 08:50:08 · 456 阅读 · 0 评论 -
剑指Offer(面试题35~37)
面试题35:第一个只出现一次的字符题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。char FirstNotRepeatingChar(char* pString){ if(pString == NULL) return '\0'; const int tableSize = 256; unsigned int has原创 2016-11-06 09:49:00 · 404 阅读 · 0 评论 -
剑指Offer(面试题38~39)
面试题38:数字在排序数组中出现的次数题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。//递归的代码找到排列数组中的第一个k:int GetFirstK(int* data,int length,int k,int start,int end){ if(start > end)原创 2016-11-06 11:31:31 · 370 阅读 · 0 评论 -
剑指Offer(面试题40~42)
面试题40:数组中只出现一次的数字题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写出程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:我们还是从头到尾依次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数字的异或结果。因为其他数字都出现了两次,在异或中全部抵消了。由于这两个数字肯定不一样,那么异或的结果肯定不为0,也就是说在这个结果原创 2016-11-06 15:48:30 · 481 阅读 · 0 评论 -
剑指Offer(面试题43~45)
面试题43:n个骰子的点数题目:把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概念。 解法一:基于递归求骰子点数,时间效率不够高 要想求出n个骰子的点数和,可以先把n个骰子分成两堆:第一堆只有一个,另一堆有n-1个。单独的那一个有可能从1到6的点数。我们需要计算从1到6的每一种和剩下的n-1个骰子来计算点数和。接下来把剩下的n-1个骰子还是分成两堆,第一原创 2016-11-06 20:37:48 · 406 阅读 · 0 评论 -
剑指Offer(面试题47、48)
面试题47:不用加减乘除做加法题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。int Add(int num1,int num2){ int sum,carry; do { sum = num1 ^ num2; carry = (num1 & num2) << 1; num1 = sum;原创 2016-11-06 21:01:43 · 473 阅读 · 0 评论 -
剑指Offer(面试题49-50)
面试题49:把字符串转换成整数enum Status {kValid = 0,kInvalid};int g_nStatus = kValid;int StrToInt(const char* str){ g_nStatus = kInvalid; long long num = 0; if(str != NULL && *str != '\0') {原创 2016-11-06 21:43:43 · 485 阅读 · 0 评论 -
剑指Offer(面试题29~30)
面试题29:数组中出现次数超过一半的数字题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。bool g_bInputInvalid = false;bool CheckInvalidArray(int* numbers,int length){原创 2016-11-05 12:51:53 · 438 阅读 · 0 评论 -
剑指Offer(面试题27~28)
面试题27:二叉搜索树与双向链表题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode*原创 2016-11-05 11:14:53 · 493 阅读 · 0 评论 -
剑指Offer(面试题3~5)
面试题3:二维数组中的查找题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。通过分析发现规律:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数组所在的行。也就是说如果要查原创 2016-11-04 09:41:01 · 480 阅读 · 0 评论 -
剑指Offer(面试题8~10)
查找和排序都是程序设计中常用的算法。查找相对而言较为简单,不外乎顺序查找、二分查找、哈希表查找和二叉排序树查找。 实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两个部分,比选择的数字小的数字移到数组的左边,比选择的数字打的数字移到数组的右边。这个函数可以如下实现:int partition(int data[],int length,int start,int end)原创 2016-11-04 11:25:49 · 361 阅读 · 0 评论 -
剑指Offer(面试题11-13)
面试题11:数值的整除次方题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。 解析:当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。既然有求倒数,我们很自然就要想到有没有可能对0求倒数。当底数(base)为0时指数是负数的时候,如果不做特殊处理,就会出现对0原创 2016-11-04 15:54:16 · 443 阅读 · 0 评论 -
剑指Offer(面试题14-18)
面试题14:调整数组顺序使奇数位于偶数前面题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组后半部分。void Reorder(int* pData,unsigned int length,bool (*func)(int)){ if(pData == NULL || length == 0) return;原创 2016-11-04 16:00:54 · 347 阅读 · 0 评论 -
剑指Offer(面试题19~23)
面试题19:二叉树的镜像题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}; 求一棵树的镜像的过程:先前序遍历这棵树的每原创 2016-11-04 19:22:24 · 343 阅读 · 0 评论 -
剑指Offer(面试题19-20)
面试题19:二叉树的镜像题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}; 程序如下:void MirrorRecursively(Bi原创 2016-11-05 07:26:07 · 498 阅读 · 0 评论 -
剑指Offer(面试题22~24)
面试题22:栈的压入、弹出序列题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压入顺序,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该栈序列的弹出序列。判断一个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的原创 2016-11-05 08:37:04 · 535 阅读 · 0 评论 -
剑指Offer(面试题25~26)
面试题25:二叉树中和为某一值的路径题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTre原创 2016-11-05 10:14:20 · 391 阅读 · 0 评论 -
面试题——操作系统
例题1:试解释操作系统原理中的作业、进程、线程、管程各自的定义。答:作业:用户在一次解题或一个事务处理过程中要求计算机系统所做工作的集合。包括用户程序、所需要的数据及控制命令。作业是由一系列有序的步骤组成的。 进程:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同的进程。 线程:线程是进程中的一个实体,是被系统独立调度和执行原创 2016-11-02 09:20:47 · 1016 阅读 · 0 评论