一道面试题, 谁能帮我看看怎么做, 实在想不出来了

问题描述

一个int的数组,有些数字只出现一次,有些数字出现两次,只有一个数字出现了3次,求出现3次的这个数字,不可以用额外的空间(用位操作)

解决方案

解决方案二:
不用额外的空间你怎么遍历这个数组?
解决方案三:
引用1楼vnvlyp的回复:

不用额外的空间你怎么遍历这个数组?

4点多还不睡觉啊,注意休息啊。
解决方案四:
先把数据排序,交换值时用下面的位操作。inta=2;intb=3;a^=b;b^=a;a^=b;

排好序之后就很容易找出3个相同的了
解决方案五:
引用3楼zmcmm的回复:

先把数据排序,交换值时用下面的位操作。inta=2;intb=3;a^=b;b^=a;a^=b;

排好序之后就很容易找出3个相同的了

关键你能不用额外空间进行排序吗?循环变量都没有的排序还真是不会。
解决方案六:
没有限制复杂度,直接先排序,再比较即可。两个关键点:1.排序的时候,两个位置的交换,通过a[i]=a[i]+a[j];a[j]=a[i]-a[j];a[i]=a[i]-a[j];或者用LZ说的异或操作也行2.比较的时候从下标1比较到a.length-2遍历,a[i]与a[i-1]、a[i+1]比较,就可以得到3个重复的了
解决方案七:
引用5楼oh_Maxy的回复:

没有限制复杂度,直接先排序,再比较即可。两个关键点:1.排序的时候,两个位置的交换,通过a[i]=a[i]+a[j];a[j]=a[i]-a[j];a[i]=a[i]-a[j];或者用LZ说的异或操作也行2.比较的时候从下标1比较到a.length-2遍历,a[i]与a[i-1]、a[i+1]比较,就可以得到3个重复的了

解决方案八:
这个看似是可以的,不知道是不是面试官的想法。引用5楼oh_Maxy的回复:

没有限制复杂度,直接先排序,再比较即可。两个关键点:1.排序的时候,两个位置的交换,通过a[i]=a[i]+a[j];a[j]=a[i]-a[j];a[i]=a[i]-a[j];或者用LZ说的异或操作也行2.比较的时候从下标1比较到a.length-2遍历,a[i]与a[i-1]、a[i+1]比较,就可以得到3个重复的了

解决方案九:
这种算法题真是头疼,是不是还有更好的算法呢???求高手
解决方案十:
是这个意思不??packagecom.gao.csdn;importjava.util.ArrayList;importjava.util.Collection;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;/***一个int的数组,有些数字只出现一次,*有些数字出现两次,只有一个数字出现了3次,*求出现3次的这个数字,不可以用额外的空间(用位操作*@authorpcgmy**/publicclassArrayHelp{/***@paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubintarr[]=newint[]{1,1,3,5,5,6,7,5};//set为不重复的集合Set<Integer>cot=newHashSet<Integer>();//遍历数组for(inti=0;i<arr.length;i++){cot.add(arr[i]);}Iterator<Integer>it=cot.iterator();//增强for循环while(it.hasNext()){intk=0;inti=it.next();for(intj=0;j<arr.length;j++){if(arr[j]==i){k++;}}if(k==3){System.out.println(i);}}}}
解决方案十一:
回答楼上,这题主要是要求用位操作去做,但是没有要求复杂度,所以有点没思路了,你的方法也许可行但是不符合要求啊(位操作)
解决方案十二:
这面试题,难道真的无解了,我在网上也搜到过,但是光有题目,没有答案。哎!
解决方案十三:
引用9楼sg19911227的回复:

是这个意思不??packagecom.gao.csdn;importjava.util.ArrayList;importjava.util.Collection;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;/***一个int的数组,有些数字只出现一次,*有些数字出现两次,只有一个数字出现了3次,*求出现3次的这个数字,不可以用额外的空间(用位操作*@authorpcgmy**/publicclassArrayHelp{/***@paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubintarr[]=newint[]{1,1,3,5,5,6,7,5};//set为不重复的集合Set<Integer>cot=newHashSet<Integer>();//遍历数组for(inti=0;i<arr.length;i++){cot.add(arr[i]);}Iterator<Integer>it=cot.iterator();//增强for循环while(it.hasNext()){intk=0;inti=it.next();for(intj=0;j<arr.length;j++){if(arr[j]==i){k++;}}if(k==3){System.out.println(i);}}}}

不行的,集合框架本身就申请了额外空间了;另外,凡是面试题,尽量少用集合框架,不然等着被对手PK掉。
解决方案十四:
引用12楼SmallYamateh的回复:

Quote: 引用9楼sg19911227的回复:
是这个意思不??packagecom.gao.csdn;importjava.util.ArrayList;importjava.util.Collection;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;/***一个int的数组,有些数字只出现一次,*有些数字出现两次,只有一个数字出现了3次,*求出现3次的这个数字,不可以用额外的空间(用位操作*@authorpcgmy**/publicclassArrayHelp{/***@paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubintarr[]=newint[]{1,1,3,5,5,6,7,5};//set为不重复的集合Set<Integer>cot=newHashSet<Integer>();//遍历数组for(inti=0;i<arr.length;i++){cot.add(arr[i]);}Iterator<Integer>it=cot.iterator();//增强for循环while(it.hasNext()){intk=0;inti=it.next();for(intj=0;j<arr.length;j++){if(arr[j]==i){k++;}}if(k==3){System.out.println(i);}}}}

不行的,集合框架本身就申请了额外空间了;另外,凡是面试题,尽量少用集合框架,不然等着被对手PK掉。

看到这个,你就想起有人连char数组逆序都不考虑中文2个char的问题,竟然还能20k的月薪。真是各花入各眼。会不会被pk掉真的难说
解决方案十五:
期待正确答案。。。。..
解决方案:
想想排序:冒泡,插入此类的,每个数都需要与其他数一一比较,那么,单独拿出每个数去和其他比较,异或2次为0!?够低下的效率吧。但是,快排之类的与之前类算法还用到了数值本身大小,但这道题只比较数值,我暂时就想到这些。~!
解决方案:
publicstaticvoidmain(String[]args){int[]array=newint[]{1,5,3,6,8,5,1,45,54,54,54,3,212,105,106,105,105};for(inti=0;i<array.length;i++){if(i!=0){for(intn=i;n>0;n--){if(array[n]<array[n-1]){inta=array[n];array[n]=array[n-1];array[n-1]=a;}else{break;}}}}for(inti=0;i<array.length;i++){if(i<array.length-2){if(array[i]==array[i+1]&&array[i]==array[i+2]){System.out.println(array[i]);break;}}}}

不晓得对不对
解决方案:
publicstaticvoidmain(String[]args){intnum=100;int[]array=newint[num];//添加数据for(inti=0;i<array.length-2;i++){intcount=0;for(intj=i+1;j<array.length;j++){if((array[i]^array[j])==0){count++;}}if(count==2){System.out.println(array[i]);}}}具体的验证没有做!
解决方案:
如果真的是面试题的话,答不出来,可以写自己知道的方法,总比空着好varnums=[1,2,3,5,3,2,8,77,54,33,2,4,6,12,13,5,88,33,22];varnumMap={};for(variinnums){varnum=nums[i];if(nums[i]==3){alert(num);break;}if(!numMap[num]){numMap[num]=1;}else{numMap[num]++;}}

解决方案:
引用18楼thc1987的回复:

如果真的是面试题的话,答不出来,可以写自己知道的方法,总比空着好varnums=[1,2,3,5,3,2,8,77,54,33,2,4,6,12,13,5,88,33,22];varnumMap={};for(variinnums){varnum=nums[i];if(nums[i]==3){alert(num);break;}if(!numMap[num]){numMap[num]=1;}else{numMap[num]++;}}

改下varnums=[1,2,3,5,3,2,8,77,54,33,2,4,6,12,13,5,88,33,22];varnumMap={};for(variinnums){varnum=nums[i];if(nums[num]==3){alert(num);break;}if(!numMap[num]){numMap[num]=1;}else{numMap[num]++;}}
解决方案:
1,排序2,找值packagetest;publicclassFindTarget{privatestaticinttemp;publicstaticvoidmain(String[]args){inttarget[]={3,5,2,2,7,8,9,6,1,1,0,6,6};//sortfor(inti=0;i<target.length;i++){for(intj=i+1;j<target.length;j++){if(target[i]>target[j]){temp=target[i];target[i]=target[j];target[j]=temp;}}}//3timeshasappearedfor(inti=0;i<target.length-2;i++){if(target[i]==target[i+1]){if(target[i]==target[i+2]){System.out.print(target[i]+"");}}}}}

解决方案:
publicclassFind3Times{publicstaticvoidmain(String[]args){int[]array={1,2,3,4,3,5,6,2,3,0,1};for(inti=0;i<array.length-1;i++){for(intj=array.length-1;j>i;j--){if(array[j]<array[j-1]){array[j]^=array[j-1];array[j-1]^=array[j];array[j]^=array[j-1];}}}for(inti=0;i<array.length-2;i++){if(array[i]==array[i+1]&&array[i]==array[i+2]){System.out.println(array[i]);}}}}
解决方案:
publicclassTestJava{staticint[]array=newint[21];intflag=0;publicvoidaddElement(){for(inti=0;i<6;i++){for(intj=0;j<=i;j++){array[flag++]=i+1;}}}publicstaticvoidmain(String[]args){intflag=0;TestJavatestJava=newTestJava();testJava.addElement();for(intm=0;m<array.length;m++){for(intn=0;n<array.length;n++){if((array[m]^array[n])==0){flag++;if(flag==6){System.out.println(array[m]);return;}};}flag=0;}}}

解决方案:
publicclassSuozu{publicstaticvoidmain(String[]args){int[]arr={1,2,1,3,4,5,6,7,5,6,8,9,10,1,12};for(inti=0;i<arr.length-2;i++){for(intj=i+1;j<arr.length-1;j++){for(intk=j+1;k<arr.length;k++){if(arr[i]==arr[j]&&arr[i]==arr[k]){System.out.println("arr["+i+"]=arr["+j+"]=arr["+k+"]="+arr[i]);break;}}}}}}

缸入门的菜鸟,没学过位运算,用学到的基础for做了一个,沾边吗?
解决方案:
publicstaticvoidmain(String[]args)throwsIOException{int[]arr={1,2,2,3,3,5,5,6,6,6,7,7};intrs=arr[0];for(inti=0;i<arr.length;i++){rs^=~arr[i];System.out.println(rs);}System.out.println(rs);}

解决方案:
有个小BUG修正一下int[]arr={1,1,1,2,2,3,3,5,5,6,6,7,7};intrs=arr[0];for(inti=1;i<arr.length;i++){rs^=~arr[i];}System.out.println(rs);

解决方案:
但是有出现一次的啊,25楼的方法就不行了吧
解决方案:
引用26楼buptcjj的回复:

但是有出现一次的啊,25楼的方法就不行了吧

没问题,可以拿来试试的
解决方案:
不用额外空间不能遍历数组还真没想出来。期待正确答案。
解决方案:
位操作好像leetcode上边看到过一道题,貌似用的是亦或运算来找到不同的值,如果这道题没有出现一次的数字的话,从头到位亦或一次就行。不过这道题貌似不行,想不出来。。。
解决方案:
inton(int[]some){for(inti=some.length-1;i>=2;){intthe=some[i];intcount=0;for(intj=--i;j>=0;j---){if(some[j]==the&&(++count==2)){returnthe;}}}return0;}

解决方案:
不可以用额外的空间(用位操作)不知道这样行不行(for循环里面的i,j算是额外的空间吗……)另外算法复杂度要不要考虑……publicstaticvoidmain(String[]args){inta[]={8,3,10,10,5,3,3,5,6};for(inti=0;i<a.length;i++){for(intj=i+1;j<a.length;j++){if(a[i]>a[j]){a[i]=a[i]^a[j];a[j]=a[i]^a[j];a[i]=a[i]^a[j];}}}for(inti=0;i<a.length-2;i++){if(a[i]==a[i+1]&&a[i+1]==a[i+2]){System.out.print(a[i]);}}}

解决方案:
publicclassSearchTest{publicstaticvoidmain(String[]args){int[]a={10,2,3,4,5,6,7,8,9,3,2,4,6,7,8,10,10,2};for(inti=0;i<a.length;i++){for(intj=i+1;j<a.length;j++){if(((a[i]&a[j])==a[j])&&((a[i]&a[j])==a[i])){//System.out.println("i的数为:"+i+"j的数为:"+j);for(intk=j+1;k<a.length;k++){//System.out.println("j的数为:"+j+"k的数为:"+k);if((a[j]&a[k])==a[k]&&(a[j]&a[k])==a[j]){System.out.println("找到的数为:"+a[k]);continue;}}}}}}}不知道这样行不行,就测试了几个数,
解决方案:
publicclassFindNum{publicstaticvoidmain(String[]args){int[]a={1,2,2,3,3,3,..};if((a[0]&a[1])==a[0]){if((a[0]&a[2])==a[0]){System.out.println("您要找的是:"+a[0]);}elseif..{}elseif((a[0]&a[a.length-1])==a[0]){System.out.println("您要找的是:"+a[0]);}}elseif((a[0]&a[2])==a[0]){..}elseif..{}elseif((a[0]&a[a.length-2)==a[0]){..}if((a[1]&a[2])==a[1]){..}elseif..{}if..{}if((a[a.length-3]&a[a.length-2])==a[a.length-3]){..}}}

解决方案:
上面12行括号写错了,应为..&a[a,length-2])==..
解决方案:
这个是完整的代码吗?能大概讲下思路吗?引用33楼Std_Wang的回复:

publicclassFindNum{publicstaticvoidmain(String[]args){int[]a={1,2,2,3,3,3,..};if((a[0]&a[1])==a[0]){if((a[0]&a[2])==a[0]){System.out.println("您要找的是:"+a[0]);}elseif..{}elseif((a[0]&a[a.length-1])==a[0]){System.out.println("您要找的是:"+a[0]);}}elseif((a[0]&a[2])==a[0]){..}elseif..{}elseif((a[0]&a[a.length-2)==a[0]){..}if((a[1]&a[2])==a[1]){..}elseif..{}if..{}if((a[a.length-3]&a[a.length-2])==a[a.length-3]){..}}}

解决方案:
思路就是不定义任何中间变量,循环控制变量,自然就不会申请额外的空间,利用A&A=A的关系,从a[0]开始利用if分支语句逐一查找,每当找到有3个相同元素,输出该元素
解决方案:
当然上面那段代码不是完整的,我只是试着将我的想法写出来而已
解决方案:
看到代码有点跪了,居然可以这么做
解决方案:
#include<stdio.h>#include<stdlib.h>intmain(){intarrays[11]={1,2,3,2,5,6,3,4,3,2};inti=0,j=0,k=0;for(i=0;i<10;i++)for(j=i+1;j<10;j++)for(k=j+1;k<10;k++){if(((arrays[i]|~arrays[j])==~0)&&((arrays[i]&~arrays[j])==0))if(((arrays[i]|~arrays[k])==~0)&&((arrays[i]&~arrays[k])==0))printf("a[%d]=%d,a[%d]=%d,a[%d]=%dn",i,arrays[i],j,arrays[j],k,arrays[k]);}system("pause");return1;}
解决方案:
39楼正解,。。。
解决方案:
引用39楼gojoy_x13的回复:

#include<stdio.h>#include<stdlib.h>intmain(){intarrays[11]={1,2,3,2,5,6,3,4,3,2};inti=0,j=0,k=0;for(i=0;i<10;i++)for(j=i+1;j<10;j++)for(k=j+1;k<10;k++){if(((arrays[i]|~arrays[j])==~0)&&((arrays[i]&~arrays[j])==0))if(((arrays[i]|~arrays[k])==~0)&&((arrays[i]&~arrays[k])==0))printf("a[%d]=%d,a[%d]=%d,a[%d]=%dn",i,arrays[i],j,arrays[j],k,arrays[k]);}system("pause");return1;}

C语言有点忘了,有人能翻译成java语言不
解决方案:
有点扯,遍历数组也得有个下标变量吧,这都不准用么
解决方案:
好像只要这样就可以得到那个三次出现的数了。int[]arr={1,1,2,2,3,3,3,5,5,6,6,7,7,8};intcount=0;for(inti=0;i<arr.length;i++){count=0;//每次count都要清0for(intj=i;j<arr.length;j++){if((~arr[i]&arr[j])==0)//两个数相同{count++;}if(count==3)//碰到两次相同的数,说明此数有三个,找到该数{System.out.println("这就是你要找的数..."+arr[j]);break;}}}
解决方案:
反正就是不能用int我是这样理解的那就用3循环publicstaticvoidmain(String[]args){int[]arr={1,1,2,2,3,3,3,5,5,6,6,7,7,8};for(inti=0;i<arr.length-2;i++){for(intj=i+1;j<arr.length-1;j++){if(arr[i]==arr[j]){for(intk=j+1;k<arr.length;k++){if(arr[j]==arr[k]){System.out.println("出现三次的数为"+arr[k]);break;}}}else{continue;}}}}
解决方案:
参考异或的思路写的,谢过3楼publicintfind(int[]arr){Arrays.sort(arr);for(inti=0;i<arr.length-2;i++){if(((arr[i+1]^arr[i])==0)&&((arr[i+1]^arr[i+2])==0)){returnarr[i];}}return0;}
解决方案:
引用41楼hcb1208的回复:

Quote: 引用39楼gojoy_x13的回复:
#include<stdio.h>#include<stdlib.h>intmain(){intarrays[11]={1,2,3,2,5,6,3,4,3,2};inti=0,j=0,k=0;for(i=0;i<10;i++)for(j=i+1;j<10;j++)for(k=j+1;k<10;k++){if(((arrays[i]|~arrays[j])==~0)&&((arrays[i]&~arrays[j])==0))if(((arrays[i]|~arrays[k])==~0)&&((arrays[i]&~arrays[k])==0))printf("a[%d]=%d,a[%d]=%d,a[%d]=%dn",i,arrays[i],j,arrays[j],k,arrays[k]);}system("pause");return1;}

C语言有点忘了,有人能翻译成java语言不

感觉像是考:xor(^)xor可以表示=,因为不能用中间变量存储,所以就使用xor了

时间: 2024-07-28 23:10:44

一道面试题, 谁能帮我看看怎么做, 实在想不出来了的相关文章

一道面试题(关于千万量级数据结构排序)

问题描述 一道面试题(关于千万量级数据结构排序) 题目: 已知文件中存有全国英语六级历年来的成绩(千万级别,考生分数都是正整数,最高710分),每一行都是一个人的姓名.考号和成绩,请你对考生的成绩从高到低进行排序,输出到另一个文件中. 格式 如下: 李四,201008823,678: 张三,201007432,356: 王五,201322233,464: 排序后: 李四,201008823,678: 王五,201322233,464: 王五,201322233,464: 要求:使空间复杂度和时间

语言 面试题-一道面试题,不是很清楚这个例子怎么解答,求大神帮助.

问题描述 一道面试题,不是很清楚这个例子怎么解答,求大神帮助. 提问是 这段代码有什么问题, 有什么解决思路.(我其实连问题都没看出来,代码可以编译) // Memory-mapped peripheral#define STATUS_REG_ADDR 0x12345678 // 32-bit status register#define DATA_REG_ADDR 0x1234567C // 32-bit data register // Status register bits#define

c++-一道题目,请大家帮帮忙,谢谢了

问题描述 一道题目,请大家帮帮忙,谢谢了 [问题描述] 小山田心子是一只快乐的小白兔,某天她看到一座彩虹桥,彩虹桥长度为N,每个单位都有一个美观度,小山田心子一开始在单位1,并取走单位1的美观值,接下来她会在从下一格开始到N中选择一个最大美观度的单位跳过去(如果美观值相同取前面的),然后取走美观值,直到她走到N,请输出她取走的美观度之和. [输入格式] 第一行一个整数N(10<N<1000),接下来一行N个整数表示彩虹桥每个单位的美观度. [输出格式] 小山田心子取过的美观值之和. [输入样例

初始化顺序-今年阿里巴巴的一道笔试题

问题描述 今年阿里巴巴的一道笔试题 public class Test1 { public static int k = 0; public static Test1 t1 = new Test1("t1"); public static Test1 t2 = new Test1("t2"); public static int i = print("i"); public static int n = 99; public int j = pr

结构体定义-如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题。

问题描述 如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题. Node包含50个字符.

从一道面试题说去

    有一道面试题: 给定n个整型数,怎样让这n个数的使用空间最小.      ok,我们都知道在32位的机器下,int类型的数占4个字节,因此n个数总的使用空间应该是4n.(64位不做解释)那我们怎么样才能使得n个数字的使用空间最小呢?     一. 我们先来看一个例子           假设现在有3个数,1,2,3.           我们都知道数字最后都是以二进制的方式存储的,我们可以表示出1,2,3的二进制           1: 0000 0000 0000 0000 0000

《Wireshark网络分析就这么简单》—从一道面试题开始说起

从一道面试题开始说起Wireshark网络分析就这么简单从一道面试题开始说起我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精

《大咖讲Wireshark网络分析》—从一道面试题开始说起

从一道面试题开始说起大咖讲Wireshark网络分析我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精英们难住.本文要介绍的便

一道面试题:布尔变量

FROM:酷壳 下面这篇文章是从StackOverflow来的.LZ面试的时候遇到了一道面试题:"如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true",于是LZ做了下面的这样的程序: boolean atLeastTwo(boolean a, boolean b, boolean c) { if ((a && b) || (b && c) || (a && c)) { return true; } else { r

mysql一道面试题

mysql> #一道面试题 mysql> #把一张表num 的值[20-30]之间的数全改为20 mysql> #并且把[30-40]之间的数全改为30 mysql> create table mianshi ( -> num int -> ); Query OK, 0 rows affected (1.94 sec) mysql> show tables; +----------------+ | Tables_in_test | +--------------