一道有趣的面试题

  前两天在刷leetcode的时候,遇到了一题Implement Rand10() Using Rand7(),rand7()可以给你等概率返回1-7的任意一个数,让你用rand7()实现一个rand10(),rand()可以等概率返回1-10的任意一个数。后来又在上网中不经意看到了另一题rand5()实现rand7(),更早些,我自己面试的过程中也遇到过类似的题。再早些在大二的时候,有个学姐在群里问过的一道她遇见的一道类似的面试题,我们先来从这道题开始,逐步剖析这种randX()–>randY()的题目怎么做。
Continue reading

How to be a qualified interviewer?

  首先声明一点,我没怎么面试过别人,只是参加过几场面试,经历的面试官只有小20个吧,所以根本没有资格去评判一个面试官是不是合格的面试官。但经过我最近的一些经历,以及朋友做面试官的体会,再加上自己对面试的思考,形成了一个自己对面试官好坏评判的标准。其实也算是最自己将来面试别人或者被面试积累一些经验。提前声明,这里只是我个人的体会,不一定正确。
Continue reading

Leetcode 240. Search a 2D Matrix II

题目链接:Search a 2D Matrix II

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
Integers in each row are sorted in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.

  此题是74题Search a 2D Matrix的升级版,所给出的矩阵性质相对74题少了一条,只保证了每行和每列都是增序的,但依旧有O(m+n)的解法。

Continue reading

Leetcode 74. Search a 2D Matrix

题目链接:Search a 2D Matrix

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
* Integers in each row are sorted from left to right.
* The first integer of each row is greater than the last integer of the previous row.

  这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。

Continue reading

Leetcode Single Number II (面试题推荐)


    还记得《剑指offer》和《编程之美》等书上多次出现的找一个数组中只出现一次的数那个题吗?

    leetcode也有这道题 链接here  相信大家都知道用异或在O(n)的时间复杂度内求出的方法,这里不再赘述。

下面就是上题的升级版

Given an array of integers, every element appears three times except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

   给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。

   这样就不能使用异或的方法了,把所有元素以后得到的就是所有元素的异或值了,对我们没有任何帮助。

   这个问题依旧使用位运算来解决,不过更加复杂。

   我们用三个变量one two three,分别存储二进制未分别出现一次 两次 三次的位。

class Solution {
public:
    int singleNumber(int A[], int n) {
        int one = 0, two = 0, three = 0;
        for(int i = 0; i < n; i++)
        {
            three = two & A[i];                    //出现三次的位肯定是由出现两次的得到的
            two = two | ones & A[i];          //出现两次的肯定是出现一次的得到的,不过还有原有的所以要或
            one = one | A[i];                       //计算出现一次的位  
            two = two & ~three;               //去掉二进制中出现三次的位
            ones = one & ~three;               //去掉二进制中出现三次的位</span>
        }
        return one;                                     //最终twos three都为0,one就是我们要的答案
    }
};