整理的几个面试题目

10 篇文章 0 订阅
5 篇文章 0 订阅

整理了几个面试题, 可能会用到;  有几个难度应该算是比较大;

对于没工作经验、没实际经验的本科、研究生,不容易想清楚, 更不容易写好。



一堆球中有1个球较轻;求y次天平比较,才能找出 这堆球[总数x]中较轻的那个球。  求y与x的关系。

x = 3^^y
3个球, 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];
}
};
============老题====================
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值