zoukankan      html  css  js  c++  java
  • 剑指Offer

    面试题7:用两个栈实现队列

    如果需要插入队尾,就压入到stack1,如果需要删除队首,需要判断stack2是否为空,若为空,则将stack1弹出压入stack2,stack2栈顶即为队首

    面试题8:旋转数组的最小数字

    题目:将一个数组最开始的若干个元素搬到数组的末尾,我们成为数组的旋转,输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4, 5, 1, 2}为{1, 2, 3, 4,5}的一个旋转,该数组的最小值为1

     1 int Min(int* numbers, int length)
     2 {
     3     if (numbers == NULL || length == 0)
     4         return -1;
     5     int index1 = 0;
     6     int index2 = length - 1;
     7     //当该数组本身就是从小到大顺序的数时,第一个数就应该返回,所以初始化indexMid为第一个数
     8     int indexMid = index1;
     9     while (numbers[index1] >= numbers[index2])
    10     {
    11         //如果相差为一时就找到了
    12         if (index1 + 1 == index2)
    13         {
    14             indexMid = index2;
    15             break;
    16         }
    17         indexMid = (index1 + index2) / 2;
    18         //如果三个数相同,并不能确定最小的数在前半部分还是后半部分,所以只能顺序查找
    19         if (numbers[index1] == numbers[index2] && numbers[index1] == numbers[indexMid])
    20         {
    21             return MinInOrder(numbers, index1, index2);
    22         }
    23         //中间的数大于第一个数时,中间的数属于前面序列
    24         if (numbers[index1] <= numbers[indexMid])
    25         {
    26             index1 = indexMid;
    27         }
    28         else if (number[index2] >= numbers[indexMid])
    29         {
    30             //否则就是中间的数小于第二个指针指向的数,这时中间的数属于后半个序列
    31             index2 = indexMid;
    32         }
    33     }
    34     return numbers[indexMid];
    35 }
    36 int MinInOrder(int* numbers, int index1, int index2) 
    37 {
    38     int result = numbers[index1];
    39     for (int i = index1 + 1; i <= index2; i++)
    40     {
    41         if (result > numbers[i])
    42             result = numbers[i];
    43     }
    44     return result;
    45 }
    面试题8

     面试题10:二进制中1的个数

    题目:输入一个数,输出概述二进制表示中1的个数,

    1.

     1 //直接判断最右边一位是否为一,然后该数右移一位
     2 //缺点:不能判断负数,例如-1二进制为FFFF右移补符号位
     3 int NumberOf1(int n)
     4 {
     5     int cnt = 0;
     6     while (n)
     7     {
     8         if (n & 1)
     9             cnt++;
    10         n >>= 1;
    11     }
    12     return n;
    13 }
    14 //找一个数来一位一位的测,每次要左移一位
    15 int NumberOf1(int n)
    16 {
    17     int cnt = 0;
    18     unsigned int flag = 1;
    19     while (flag)
    20     {
    21         if (flag & n)
    22             cnt++;
    23         flag <<= 1;
    24     }
    25     return cnt;
    26 }
    27 // 把一个整数减一,都是把最右边的数变成0,如果它右边还有0的话,所有的0都变成1,而他左边所有位都保持不变。
    28 //接下来把一个整数和它减去1的结果做位运算,相当于把它最右边的1变成0
    29 int NumberOf1(int n)
    30 {
    31     int cnt = 0;
    32     while (n)
    33     {
    34         cnt++;
    35         n = n & (n - 1);
    36     }
    37     return cnt;
    38 }
    求二进制中1的个数

     面试题11:数值的整数次方

    注意考虑要全面,可以加个快速幂

     1 //各种情况都要考虑清楚
     2 //1底数为0,指数为负数,这种情况下是输入错误
     3 //2底数为0,指数大于等于0,这种情况是0
     4 //3底数不为0,指数小于0,要取倒数
     5 //4底数不为0,指数大于0
     6 bool g_InvalidInput = false;
     7 void Power(double base, int exponent)
     8 {
     9     if (Equal(base, 0))
    10     {
    11         if (exponent < 0)
    12         {
    13             g_InvalidInput = true;
    14             return 0.0;
    15         }
    16         else 
    17         {
    18             return 0.0;
    19         }
    20     }
    21     int absExponent = exponent;
    22     if (exponent < 0)
    23     {
    24         absExponent = -exponent;
    25     }
    26     double sum = 1.0;
    27     for (int i = 1; i <= absExponent; i++)
    28     {
    29         sum *= base;
    30     }
    31     if (exponent < 0)
    32     {
    33         sum = 1.0/sum;
    34     }
    35     return sum;
    36 }
    数值的整数次方
  • 相关阅读:
    Map基础知识01-ConcurrentHashMap
    数据结构基础03-红黑树
    vue element 表格增加删除修改数据
    好用弹出层
    如何给网页添加水平线
    如何搭建一个vue项目的详细步骤
    vue完成项目后,如何打包成静态文件
    jQuery 每隔5秒钟发送一个ajax请求 请求后台数据接口
    windows远程桌面连接提示身份验证错误,要求的函数不受支持的解决方法
    uniapp安卓app打包后获取位置信息失败解决方法(含高德地图key详细申请流程)
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/6512192.html
Copyright © 2011-2022 走看看