第一张位运算 寒假总结

1、^运算 ,可以筛选出重复或不重复的数字,但必须是双数(A^A=0   B^0 = B)也有可能会开两个数组来比较,不一定在同一个数组中比较,灵活实现

2、辅助空间的开法是

int N=100;
int arr[] = new int[N];
int helper[] = new int[N];
for(i = 0;i<N;i++){
    helper[arr[i]]++;//这里
}

3、将整数转化为二进制

System.out.println(Integer.toString(c,2));
4、一个比较神奇的结论 判断一个数是不是2的整数次方 

(N&(N—1))==0 那就是  自己推一下

5、整数的奇偶位互换

 

第一种:char ss[] = str.toCharArray();//利用toCharArray方法转换 字符串转字符数组

第二种:用0做与运算是消除 用1做与运算是保留

import java.util.Scanner;

public class Main {		
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int i = scan.nextInt();
		//保留奇数位
		int odd = i&0xaaaaaaaa;
		//保留偶数位
		int even = i&0x55555555;
		//交错按位与
		System.out.println("奇偶位交换后为:"+((odd>>1)^(even<<1)));
	}

}

6、 0~1间的浮点实数的二进制表示

例如:0.625  二进制表示为0.101                               

//0.625 表示为0.101
class Main{
    public static void main(String[] args) {
        double num = 0.625;
        StringBuilder sb = new StringBuilder("0.");
        while(num>0){
            double r = num*2;
            if(r>=1){
                sb.append("1");
                num = r-1;
            }
            else {
                sb.append("0");
                num =r;
            }
            if(sb.length()>34){
                System.out.println("ERROR");
            }
        }
        System.out.println(sb);
    }
}

str+str时,,调换前后顺序可以起到正相加,,倒着相加的功能。

7、例如:一堆数字只有一个数字出现了一次,求那个出现了一次的数字

      两个相同的二进制的数做不进位相加 结果为0

      十个相同的十进制的数做不进位相加 结果为0

      n个相同的n进制的数做不进位相加 结果为0

      

//一堆数组和一个数组 求那一个的数组
//都转化为三进制的,因为3个相同的三进制数字无进制相加和为0
class Main{
    public static void main(String[] args) {
        int [] arr = {2,2,2,7,7,7,9,3,3,3};
        int len = arr.length;
        char[][] wei = new char[len][];
        int maxlength= 0;
        for(int i=0;i<arr.length;i++){  //对于每个数字而言
            wei[i]= new StringBuilder(Integer.toString(arr[i],3)).reverse().toString().toCharArray();  //StringBUild有toarray方法
            if(wei[i].length>maxlength){
                maxlength = wei[i].length; //找出最长的
            }
        }
        int[] resArr = new int[maxlength];
        for(int i=0;i<len;i++){ //开始不进位加法 ,这一步列举所有的
            for(int j=0;j<maxlength;j++){ //每一位都要加上
                if(j>=wei[i].length){
                    resArr[j]+= 0;
                }else {
                    resArr[j] += (wei[i][j]-'0');  //那一位上是char
                }
            }
        }
        int res = 0;
        for(int i=0;i<maxlength;i++){
            res +=(resArr[i]%3)*(int)(Math.pow(3,i));
        }
        System.out.println(res);
    }
}

例题:

1、两个整数A和B 需要改变几个二进位才能将a转化为b

import java.util.Scanner;

class Main{
    public static void main(String[] args) {
        int a,b;
        Scanner sc = new Scanner(System.in);
        a = sc.nextInt();
        b = sc.nextInt();
        int c = a^b;   //亦或运算
        int count=0;
        while(c!=0){
            c = (c&(c-1));    //判断二进制中有多少个1
            count++;
        }
        System.out.println(count);
    }
}

2、一个整型数组里除了两个数字(互不相同)之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

class Main{
    public static void main(String[] args) {
        int arr[] = {1,2,3,4,5,6,1,2,3,4,5};
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i:arr){
            if(map.containsKey(i)){
                map.put(i,map.get(i)+1);
            }else {
                map.put(i,1);
            }
        }
        Set<Integer> set = map.keySet();
        for(int i:set){
            if(map.get(i) ==1){
                System.out.println(i +" ");
            }
        }
    }
}

位运算:

 

有一个博主写的特别好,我这里不太懂 https://www.cnblogs.com/hezhiyao/p/7539024.html

3、

地产大亨Q先生临终的遗愿是:拿出100万元给X社区的居民抽奖,以稍慰藉心中愧疚。
麻烦的是,他有个很奇怪的要求:

1. 100万元必须被正好分成若干份(不能剩余)。每份必须是7的若干次方元。比如:1元, 7元,49元,343元,...

2. 相同金额的份数不能超过5份。

3. 在满足上述要求的情况下,分成的份数越多越好!

请你帮忙计算一下,最多可以分为多少份?

解:

必须为7的倍数就是7进制数的问题,将1000000转换成7进制数,每一位的和就是分的分数的和。 
题目中的不能超过5份是迷惑条件,因为某个数的七进制表示是唯一的,不受条件的限制。

class Main{
    public static void main(String[] args) {
        String s=Integer.toString(1000*1000,7);

        int sum = 0;
        for(int i=0;i<s.length();i++){
            sum += s.charAt(i)-'0';

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

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值