整理了几个面试题, 可能会用到; 有几个难度应该算是比较大;
对于没工作经验、没实际经验的本科、研究生,不容易想清楚, 更不容易写好。
一堆球中有1个球较轻;求y次天平比较,才能找出 这堆球[总数x]中较轻的那个球。 求y与x的关系。
x = 3^^y3个球, 1次比较就能知道; 两端各1个, 平衡则第三个较轻; 不平衡则上浮的那端较轻;
9个球, 2次比较就能知道; 分为个数相同的3堆; 两端各放1堆;平衡则在剩余1堆中, 否则在较轻那堆中; 继续。。
=========据说来源于百度面试, 等号不确切, 应该是一个不等式 3^^(y-1) < x <= 3^^y
整理字符串。 一句英文字符串可能包含多个空格、换行。 要求按如下方式整理:
1)当连续多个空格换行时, 保留1个换行;
2)连续多个空格保留1个空格;
3)末尾的空格或者换行都去掉。
如"aBBNBcNBNcBBdNBN" ===> "aNcNcBd" N表示换行; B表示空格。
==========某年网易的面试题,写的一团糟
按层遍历2叉树。【队列; 将当前节点的儿子们入队】
===========维护队列即可
两个有序数组,长度分别为m,n; 找出归并后的中位数。【不准许做实际归并操作;中位数指中间位置的数】
思路:分别找出两个有序数组的中位数, 比较大小关系, 两个中位数将两数组划分为4段; 最终寻找的目的数只可能出现在某2段中; 在那2段中继续寻找目的数即可。
空间复杂度O(1), 时间复杂度O(log(m+n)),因为每次减少1半的数据量。
============某年微软笔试题
//文件区段、分时段数据的处理; log中ip地域处理。
1) 一个无序的range的序列,如[1,3], [8,10],[9,19], [2,6], [15,18] 写程序合并有重叠的range、并调整为有序。
2) 归并:(range1有序且不重叠、 range2有序且不重叠); 归并结果要求有序且合并重叠的部分。
3) 查询某个数值,是否被range序列的某个range包含? 如果这种查询非常多, 该range序列如何组织能优化查找性能
============来源于实际应用中
打印出正整数的所有拆分方式。 如
4可拆分成3+1; 2+2; 2+1+1; 1+1+1+1;
============排列组合生成
将有序的数组建成一个有序二叉树、同时二叉树尽量平衡。
数组中间节点作为根节点, 左半段作为左子树、右半段作为右子树。
Node *build(int a[], int n)//n为a中元素个数。
{
if(n == 0) return NULL;
if(n == 1) return new Node(a[0]);
Node *root = new Node(a[(n-1)/2]);
root->left = build(a, (n-1)/2);
root->right = build(a + (n-1)/2 + 1, n - (n-1)/2 - 1);
return root;
}
=============较普通,主要是希望平衡。
长为2*n的矩形平面; 用规格为1*2的长方形地砖; 有多少种方法铺满。
思路: 第一块转竖着放在最左侧,就是f(n-1); 或者两块砖横叠在最左侧,就是f(n-2); 因此就是 f(n) = f(n-1)+f(n-2);
==============递归========
任意给定n个正整数,求这n个正整数拼在一起能组成的最小数。
如 1, 34, 12, 43 结果为===>1123443
思路:
1) 按各数的高位由小到大排列
---高位相同,定义a < b, 如果 ab < ba 成立。
2) 直接一次性串在一起
如 1 14 17 172 22 353, 排序后不变 结果为 1141717222353
如 1 14 17 170 22 353, 排序后为 1 14 170 17 22 353 结果为 1141701722353
如 1 14 17 171 22 353 此时17 和 171的位置可互换、不影响。
如 1 14 17 17112, 排序后为1 14 17112 17 ==>1 14 1711217==>114 1711217==>1141711217
如 17 171 17112 172 排序后为17112 17 171 172 ==》1711217171172
如 17 171 1711 17112 172 排序后为1711 17112 17 171 172==>.....
证明。。?
===============据说题目出自baidu, 思路是我的, 其中细节需要证明, 应该可以证明
1)可排序
2)能串
将单链表就地反转。
struct Node {int v; struct Node *next};
struct Node *reverse(struct Node *head)
{
if(!head) return NULL;
struct Node *cur = head->next;
head->next = NULL;
while(cur)
{
//将cur放到head前面
struct Node *tmp = cur->next;
cur->next = head;
head = cur;
//继续处理下一个节点
cur = tmp;
}
return head;
}
=================老题来源于网络=================
实现一个栈, 其pop, push, 当前栈中最小值min 都是O(1)时间。
class Stack
{
vector<int> data;
vector<int> minv;
void push(int v)
{
if(data.size() == 0)
{
data.push_back(v); minv.push_back(v);
}
else
{
data.push_back(v);
if(v < minv[minv.size()-1])
minv.push_back(v);
else
minv.push_back(minv[minv.size()-1]);
}
}
int pop()
{
if(data.size() > 0)
{
minv.pop();
int v = data[data.size()-1];
data.pop();
return v;
}
}
int min()
{
if(data.size() > 0)
return minv[minv.size()-1];
}
};
============老题====================