YY笔试Java的按位与等式怎么做的啊

如题,按位与等式的那道不会做#Java工程师#
全部评论
bitmap的思想,用一个大小为64的数组,统计所有数中对应位1出现的次数,再遍历一遍,对于a[i],如果第k位是1,只要判断count[k]是不是等于N,如果第k位是0也同样道理
点赞 回复 分享
发布于 2017-09-17 17:39
如果你用暴力的话还是很简单的,反正我不会优化
点赞 回复 分享
发布于 2017-09-17 16:38
向后向前扫一遍,最后比较得结果。
点赞 回复 分享
发布于 2017-09-17 16:38
大不了暴力
点赞 回复 分享
发布于 2017-09-17 16:39
什么情况啊?java岗不是晚上7点吗?
点赞 回复 分享
发布于 2017-09-17 16:39
直接暴力,不能调试,也不知道对不对
点赞 回复 分享
发布于 2017-09-17 16:40
从大到小排序,然后按位与,看等不等于最后一位。感觉是这样,不知道对不对。
点赞 回复 分享
发布于 2017-09-17 16:42
不是挺简单的吗? 两个相同的数进行&操作还是一样的,所以N-1个数得到的&结果如果和剩下的那个数相同的话再进行&操作还是那个数。 故我们可以把全部数进行&操作,再看看得到的结果是不是在数组中出现过,如果有的话就证明是true。 public class Main { public static void main(String[] args) { int[] a = {5,4,20}; System.out.println(isAndEquation(a)); } public static boolean isAndEquation(int[] a) { int result = a[0]; for (int i = 1; i < a.length; i++) { result = result & a[i];   } for (int i = 0; i < a.length; i++) { if (result == a[i]) return true;   } return false; } }
点赞 回复 分享
发布于 2017-09-17 17:03
全部&一下,再找有没有和结果一样的数
点赞 回复 分享
发布于 2017-09-17 17:06
这是我做的,复杂度比较高。就是满足两个条件: 1、当这列按位&操作后,只有一个0时,不可能通过。return false; 2、当这列按位&操作后,存在0时,为1的全不可能为剩下的那个数。 3、由于输入的数保证了不相同,那么最后一定最多剩下一个数,将其他的数字相与,看得到的和是否与这最后一个数相等,如果相等return true;不然return false;
点赞 回复 分享
发布于 2017-09-17 17:31
public static void main(String[] args) { int b[] = {0,3,7,19,12,32,323,212,31,52}; System.out.println(isAndEqationExist(b)); } public static boolean isAndEqationExist(int a[]) { int max = 0; for (int i=0;i<a.length;i++) if(a[i]>max)max = a[i]; int count = 0; while(max>0){ max /=2; count++; } int b[] = new int[a.length]; for (int i=0;i<count;i++) { int countzero = 0; for (int j=0;j<a.length;j++) { if(b[j]!=-1) { int bei = (int) Math.pow(2,i); int nn = a[j]&bei; if(nn==0) { countzero++; }else if(countzero>0) b[j] = -1; }else continue; } for (int j=0;j<a.length;j++) { if(b[j]!=-1) { int bei = (int) Math.pow(2,i); int nn = a[j]&bei; if(nn==0) { countzero++; }else if(countzero>0) b[j] = -1; }else continue; } if(countzero==1)return false; } //搜寻完毕 int index = -1; for (int i=0;i<a.length;i++) if(b[i]==0)index = i; if(index==-1)return false; int sum = 0;boolean fir = true; for (int i=0;i<a.length;i++) { if(i!=index) { if(fir) { sum = sum ^ a[i]; fir = false; }else { sum &= a[i]; } } } if(sum==a[index])return true; return false; }
点赞 回复 分享
发布于 2017-09-17 17:31
如果某个数字的某一位只有它是0,在其他数字上这一位都是1,要记录下这个数字,因为这个总按位与sum在抽出这个数字之后这一位会改变。
点赞 回复 分享
发布于 2017-09-17 17:33
我的思路:先全部都&得到一个数,然后拿这个数和每个数分别同或运算看得到的数是否等于这个数,等于返回true,不等于遍历下个数
点赞 回复 分享
发布于 2017-09-17 17:42
记录下所有的数字的二进制位的贡献,记为Sumbit[] Sumbit[i]表示有多少个数字二进制第i位为1 然后枚举每一个数字(假设是第a[x]) 如果该数字的某个二进制位为1(假设第j位),那么Sumbit[j]一定要等于sizeof(a[]), 因为如果a[0]&a[1]...&a[n-1]=a[x]的话,那么a[0]..a[n-1]的第j位就不能有0,只要有一个0那么&之后就是0。 如果该数字的第j位为0,那么Sumbit[j]一定要小于sizeof(a[])-2,就是说一定要有一个数第j位等于0 时间复杂度sizeof(a[])*32
点赞 回复 分享
发布于 2017-09-17 18:42

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务