今天,同事发了我一个面试题:
当场我有点蒙,我知道按位或,但是或运算具体是怎么算的忘掉了,于是百度了下或运算
哦吼!挖咖喱嘛吸哒!然后就开始写程序(此处为脑抽写法,看答案请跳到最后):
思路是:
private List<Integer> intList = new ArrayList<Integer>();
//加入数字到集合
public void addNumber(int a){
intList.add(a);
}
//判断是否存在按位或为x 的子集(脑袋没亮灯泡之前)
public boolean ifExistsSubArray(int x){
boolean exist = false;
String xstr = toBinary(x);//转为二进制并反序(方便处理)
List<String> strNumber = new ArrayList<String>();
//循环数据集合,找到与 x 0 位相等的 数字
for(int i=0;i<intList.size(); ++ i){
String tmpStr = toBinary(intList.get(i));
System.out.println(intList.get(i)+":"+toConversely(tmpStr));
//位数小于x 或等于x
if(tmpStr.length() <= xstr.length()){
//判断0位是否相等
boolean res = true;
for(int j = 0; j< xstr.length();++j){
char tmpa = xstr.charAt(j);
if(tmpa == '0'){
char tmpb = j>= tmpStr.length() ? '0':tmpStr.charAt(j);
if(tmpb !=tmpa){
res = false;
}
}
}
if(res){
strNumber.add(tmpStr);
}
}
}
System.out.println("========================");
System.out.println("寻找按位或为"+x+"("+toConversely(xstr)+")的集合");
//判断是否存在 x 的非0位 至少有一个为1.
if(strNumber.size() > 0){
boolean result = true;
for(int j = 0; j< xstr.length();++j){
char tmpa = xstr.charAt(j);
if(tmpa =='1'){
boolean res = false;
for(int i=0;i<strNumber.size();i++){
char tmpb = j >= strNumber.get(i).length() ? '0':strNumber.get(i).charAt(j);
if(tmpb == '1') res = true;
}
if(!res) result = false;
}
}
for(String sss:strNumber ){
System.out.println(toConversely(sss));
}
System.out.println("----------------");
System.out.println(toConversely(toBinary(x)));
System.out.println("----------------");
return result;
}
return false;
}
//将数字转换为二进制字符串并反序
public static String toBinary(int a){
String tmp = Integer.toBinaryString(a);
return toConversely(tmp);
}
//将字符串反序
public static String toConversely(String s){
String tmps = "";
for(int i=s.length()-1;i>=0;--i){
tmps +=s.charAt(i);
}
return tmps;
}
然鹅!!!!!当我写到一半的时候!!突然一道天雷劈过!
这种按位比较,0的时候都是0,1的时候0或1,这特么不就是按位或么!!
最后代码是这样:
//寻找集合中是否存在按位或 为x 的子集(前面的方法写了一半,突然发现自己脑残了!)
public boolean ifExistsSubArray2(int x){
int y = 0;
for(int i=0;i<intList.size(); ++ i){
if((x|intList.get(i)) == x){//与x按位或,值为x
//reslist.add(intList.get(i));
y=y|intList.get(i);// 求总的按位或,不考虑中途满足条件跳出
}
}
return (y == x);
}
总结:毕竟是面试题,肯定不会太复杂,但是如果走上一个错误的思路,那将浪费很多时间,还要敲很多代码╮( ̄▽ ̄)╭
这次就把我的失误记录一下,顺便提供一下答案。