zoukankan      html  css  js  c++  java
  • 笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍

    出题:一个长度为N的数组,其中的元素取值范围是1到N,要求快速判断数组是否存在重复数字;

    分析:

    • 解法1:如果N个元素的范围都是在1到N,所以如果没有重复元素,则每一个位置恰好可以对应数组中的一个元素之,通过将当前元素k交换到其本身应该在的位 置k,也就是k=array[i], array[array[i],并判断是否存在duplication或者已经就绪。时间复杂度O(N),空间复杂度O(1);
    • 解法2:由于元素取值范围确定,可以使用BitMap将数组元素映射到对应的位置,如果一个位置对应了两个元素,则有重复。时间复杂度和空间复杂度都是O(N);
    • 解法3:先排序,O(NlogN),然后比较相邻元素是否相等,O(N);

    解题:

     1 bool HasDup(int *array, int length, int cur) {
     2         if(cur==length) return false;
     3 
     4         if(array[cur]==cur)
     5                 /**
     6                  * 注意++cur的特性,如果是cur++则参数值是cur
     7                  * 而不是cur+1
     8                  * */
     9                 return HasDup(array, length, ++cur);
    10         else if(array[cur]==array[array[cur])
    11                 return true;
    12         else {
    13                 int temp;
    14                 temp=array[cur];
    15                 array[cur]=array[temp];
    16                 array[temp]=temp;
    17                 return HasDup(array,length,cur);
    18         }
    19 }
    20 int main() {
    21         int array[]={6,5,3,1,5,4,0};
    22         if(HasDup(array,7,0))
    23                 printf("
    there is duplication");
    24         else
    25                 printf("
    there is no duplication");
    26         return 0;
    27 }

    出题:快速计算一个整数的7倍;

    分析:乘法相对较慢,所以需要转换成移位操作和加减法操作:int temp=X; X<<3 - temp

    解题:

     1 /**
     2  * 小于等于0,直接返回false
     3  * 如果为2的次幂,则二进制表示中
     4  * 有且仅有一位是1,当这个数减去1
     5  * 则原有的1变成0,其右边的所有bit
     6  * 变成1,此时他们的&操作为0
     7  * */
     8 bool If2Power(int n) {
     9         if(n<=0) return false;
    10         /**
    11          * 注意&的优先级小于=,所以必须加括号
    12          * */
    13         if((n&(n-1))==0) return true;
    14         else return false;
    15 }
    16 /**
    17  * 实现乘法可以转换成移位操作,向左移动移K位
    18  * 等于*(2^K),最后再加上或者减去差值
    19  * 注意加括号
    20  * */
    21 int Times7(int n) {
    22         int t=n;
    23         return (n<<3)-t;
    24 }
    25 
    26 int main() {
    27         if(If2Power(4))
    28                 printf("
    yes");
    29         else
    30                 printf("
    no");
    31 
    32         printf("
    21*7= %d",Times7(21));
    33         return 0;
    34 }
  • 相关阅读:
    在ASP.NET GridView 中使用e.CommandArgument传递参数
    循环处理之while and do while
    MzTreeView(梅花雪)完全攻略
    FreeTextBox使用详解
    委托、线程的用法
    Master Theorem
    python jsonpath 语法总结
    python + zmail 邮件发送
    python的yaml语法
    unittest单元测试框架总结
  • 原文地址:https://www.cnblogs.com/leo-chen-2014/p/3749281.html
Copyright © 2011-2022 走看看