算法学习第一天

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

import java.util.Random;

public class 唯一成对数{
    public static void main(String[] args) {
        int N = 5;
        int[] a=new int[N];
        for (int i = 0; i <a.length-1 ; i++) {
            a[i]=i+1;  
//因为题目中数组里的数是从1开始的。数组下标i从0开始。所以这里是i+1.
        }

        a[a.length-1] = new Random().nextInt(N); //给数组最后一位赋值


        // 打印数组以方便查看结果
        for (int i = 0; i <a.length ; i++) {
            System.out.print(a[i]+" ");
        }


        int x=0;
        for (int i = 0; i <a.length ; i++) {
            x=(x^i)^a[i];
        }
        System.out.println();      //用于换行
        System.out.println(x);


  /*
        自己的解法
        int x=0;
        int sum = 0;
        for (int i = 0; i <arr.length ; i++) {
            sum = sum+arr[i];
        }
        x=sum-1000*1001/2;   //n个数的和为n(1+n)/2
        System.out.println(x);
*/

    }
}

 2,判断一个整数是不是2的整数次方

import java.util.Scanner;

public class is2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println(Integer.toString(n,2));
        if(((n-1)&n)==0){
            //2的整数次方的整数的二进制都只有一个1,其它位均为0.所以(n-1)&n)==0
            //4的二进制是100,减1之后为011.两者相与为0.
            System.out.println("yes");
        }else{
            System.out.println("no");
        }
    }
}

3,请实现一个函数,输入一个整数,输出该数二二进制表示中1的个数。
➢例: 9的二进制表示为1001,有2位是1。

import java.util.Scanner;

public class 二进制中1的个数 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(Integer.toString(n,2));

        int count=0;
        //法一

        while (n!=0) {
            n=(n-1)&n; 
            count++;
        }
       System.out.println(count);


        //法二
        for (int i = 0; i <32 ; i++) {
            if ((n&(1<<i))==(1<<i)){
                count++;
            }
        }
        System.out.println(count);

        //法三
        for (int i = 0; i <32 ; i++) {
            if (((n>>>i)&1)==1){
                count++;
            }
        }
        System.out.println(count);

    }
}

4,将整数的奇偶位互换

import java.util.Scanner;

public class 奇偶互换 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();


        int a = n&0xaaaaaaaa;
        //和1010 1010 1010 .....做与运算取出偶数位
        int b = n&0x55555555;
        //和0101 0101 0101 .....做与运算取出奇数位
        int c = (a>>1)^(b<<1);
        //将a右移一位,b向左一位。然后两者通过异或连接。
        System.out.println(c);

    }
}

5,给定一个介于0和1之间的实数(如0.625) ,类型为double, 打印它的二进制表示(0.101, 因为小数点后的二进制分别表示0.5,0.25.0.12.....) 如果该数字无法精确地用32位以内的二进制表示,则打印"ERROR"

import java.util.Scanner;

public class 二进制表示浮点实数 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double n =sc.nextDouble();
        StringBuilder a = new StringBuilder("0.");
        //StringBuilder类也代表可变字符串对象。

        while (n>0) {
            double b=n*2;
            if (b>=1) {
                a.append("1");
                n=b-1;
            }else {
                a.append("0");
                n=b;
            }

            if (a.length()>34) {
                System.out.println("ERROR");
                return;
            }

        }
        System.out.println(a);
        }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值