zoukankan      html  css  js  c++  java
  • 小米2015笔试编程题

    小米2015笔试编程题

    1.[编程题] 懂二进制

    时间限制:1秒

    空间限制:32768K

    世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?

    输入例子1:

    1999  2299

    输出例子1:

    7

    分析:第一步求这两个数的异或,得到一个新的数,相同位是0,不同位是1;第二步采用位运算求这个数里边1的个数即为结果

     1 class Solution {
     2 public:
     3     /**
     4      * 获得两个整形二进制表达位数不同的数量
     5      * 
     6      * @param m 整数m
     7      * @param n 整数n
     8      * @return 整型
     9      */
    10     int countBitDiff(int m, int n) 
    11     {
    12         int res=m^n;
    13         int count=0;
    14         while(res)
    15         {
    16             ++count;
    17             res=(res-1)&res;
    18         }
    19         return count;
    20     }
    21 };

    2.

    [编程题] 风口的猪-中国牛市

    时间限制:1秒

    空间限制:32768K

    风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100

    输入例子1:

    3,8,5,1,7,8

    输出例子1:

    12

    分析:

    计算两次交易机会所获收益最大值,则可以先正序遍历一遍记录第k天时第一次交易可以获得的最大收益,然后再后序遍历一次,记录第k天时后面有第二次交易可获的最大收益。再将第k天的两次交易最大值相加比较即可获得结果。注意,正序遍历时表示在第k天之前可以获得的最大收益,后序遍历表示第k天后面可以获得的最大收益。了两个收益相加就是最大收益。

     1 class Solution {
     2 public:
     3     /**
     4      * 计算你能获得的最大收益
     5      * 
     6      * @param prices Prices[i]即第i天的股价
     7      * @return 整型
     8      */
     9     int calculateMax(vector<int> prices) {
    10         int len = prices.size();
    11         vector<int> leftmax(len);
    12         vector<int> rightmax(len);
    13         
    14         //正序遍历
    15         int primin = prices[0];
    16         leftmax[0] = 0;
    17         for(int i=1;i<len;++i){
    18             primin = min(primin, prices[i]);
    19             leftmax[i] = max(leftmax[i-1], prices[i] - primin);
    20         }
    21         
    22         //后序遍历
    23         int primax = prices[len-1];
    24         rightmax[len-1] = 0;
    25         for(int i=len-2;i>=0;--i){
    26             primax = max(primax, prices[i]);
    27             rightmax[i] = max(rightmax[i+1], primax - prices[i]);
    28         }
    29         
    30         int pmax = 0;
    31         for(int i=0;i<len;++i)
    32             pmax = max(pmax, leftmax[i] + rightmax[i]);
    33         return pmax;
    34         
    35     }
    36 };

    3.[编程题] 小米Git

    时间限制:1秒

    空间限制:32768K

    git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^          | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0'或'1'组成,长度为n。matrix[i][j]=='1'当且仅当git树种第i个和第j个节点有连接。节点0为git树的根节点。)

    输入例子1:

    [01011,10100,01000,10000,10000],1,2

    输出例子1:

    1

    分析:题意没太理解,理解了再补充

  • 相关阅读:
    hdu2328 Corporate Identity
    hdu1238 Substrings
    hdu4300 Clairewd’s message
    hdu3336 Count the string
    hdu2597 Simpsons’ Hidden Talents
    poj3080 Blue Jeans
    poj2752 Seek the Name, Seek the Fame
    poj2406 Power Strings
    hust1010 The Minimum Length
    hdu1358 Period
  • 原文地址:https://www.cnblogs.com/lxt1105/p/7424257.html
Copyright © 2011-2022 走看看