zoukankan      html  css  js  c++  java
  • 算法很美 第一章

    目录

    1.位运算与进制基础

    2.题解

    位运算符:

    在处理整型数值时,可以直接对组成整形数值的各个位进行操作。这意味着可以使用屏蔽技术获得整数中的各个位(??)

    &(与),|(或),^(异或),~(非/取反)

    >>和<<运算符将二进制进行右移或者左移操作

    >>>运算符将用0填充高位;>>运算符用符号位填充高位,没有<<<运算符

    对于int型,1<<35与1<<3是相同的,而左面的操作数是long型时需对右侧操作数模64

    与:都为1结果为1,或:有一个为1结果为1,异或:二者不同时结果为1

    位运算的奇巧淫技

    判断奇偶数     x&1=1   奇数      x&1=0  偶数

    获取二进制位是1还是0(两种解决方案)

    交换两个整数变量的值

    不用判断语句,求整数的绝对值

    异或可理解为不进位加法:1+1=0,0+0=0,1+0=1;

    性质

    1.交换律 可任意交换运算因子的位置,结果不变

    2.结合律 (即(a^b)^c==a^(b^c))

    3.对于任何数x,都有x^x=0,x^0=x,同自己求异或为0,同0求异或为自己

    4.自反性A^b^b=A^0=A,连续和同一个因子做异或运算,最终结果为自己

    题1:找出唯一成对的数

    1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现

    import java.util.Arrays;
    import java.util.Random;
    
    
    public class _01唯一成对的数 {
        /**
           * 在数组内原址交换元素
           *
           * @param arr
           * @param i
           * @param j
           */
          public static void swap(int[] arr, int i, int j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
          }
          public static void print(int[] arr) {
                System.out.println(Arrays.toString(arr));
              }
          public static void main(String[] args) {
            int N=1001;
            int []arr=new int[N];
            for(int i=0;i<arr.length-1;i++){
                arr[i]=i+1;
            }
            //最后一个数,是随机数
            arr[arr.length-1] = new Random().nextInt(N-1)+1;
            //随机下标
             int index = new Random().nextInt(N);
             swap(arr, index, arr.length-1);
             print(arr);
             int x1=0;
             for(int i=1;i<=N-1;i++){
                 x1=x1^i;
             }
             for(int i=0;i<N;i++){
                 x1=x1^arr[i];
             }
             System.out.println(x1);
             
             
             System.out.println("-------");
             int []helper=new int[N];
             for(int i=0;i<N;i++){
                 helper[arr[i]]++;
             }
             for(int i=0;i<N;i++){
                 if(helper[i]==2){
                     System.out.println(i);
                     break;
                 }
             }
        }
    }

      

  • 相关阅读:
    Linux部署之NFS方式安装系统
    VMware Workstation Pro学习探索(Linux,Docker)
    sqlserver最大内存设置太小导致无法启动sql服务
    Docker下安装Sqlserver(mssql)
    docker错误:net/http: TLS handshake timeout;解决方案
    Linux和Docker常用命令
    Linux及Docker学习记录
    .net core视图预编译
    oracle的一些简单语法
    Oracle安装连接常见错误
  • 原文地址:https://www.cnblogs.com/faded8679/p/10390049.html
Copyright © 2011-2022 走看看