网易面试题之:小易有一个初始为空的数字集合。。。

本文分享了一个面试中遇到的按位或运算题目,初始采用复杂算法解决,后简化为直接按位或判断。提醒面试者应避免过度复杂化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,同事发了我一个面试题:

当场我有点蒙,我知道按位或,但是或运算具体是怎么算的忘掉了,于是百度了下或运算

哦吼!挖咖喱嘛吸哒!然后就开始写程序(此处为脑抽写法,看答案请跳到最后):

思路是:

	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);
	}

总结:毕竟是面试题,肯定不会太复杂,但是如果走上一个错误的思路,那将浪费很多时间,还要敲很多代码╮( ̄▽ ̄)╭

这次就把我的失误记录一下,顺便提供一下答案。

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心怀寰宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值