A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王亚运 中级黑马   /  2012-10-27 22:34  /  3048 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王亚运 于 2012-10-28 09:25 编辑

题目:
一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【1, 2,4,5,6,4,2】,只有1,5,6这三个数字是唯一出现的,我们只需要输出1,5,6中的一个就行。

CSDN别人博客看得的
那位先生用的C写的,好吧,我不会C。
感兴趣可以看下。
地址:http://blog.csdn.net/w397090770/article/details/8032898

然后,我想了下用JAVA 写。
思路还算清晰。
几分钟就想出来。
七点半开始写,直到现在才成功。。。三个多小时。。
半个小时写完代码,写完大体,编译报错50多个。。。
当时想哭啊。。{:soso_e109:}
然后修改,不下10次,才算编译过去,
运行结果和预料的不一样,
在修改,又是N次,最后原因是最后的if语句,偷懒没加{},多谢了:导致的。。。教训
思路是:
1:创建一个新数组,用来记录要选择的数组每个元素出现的次数,
这里借助一个计数器,
特别注意计数器计数完毕需要归零,开始没注意,总是失败。。。
2:然后 选择性输出,出现次数为一次或者多次的元素。
不知道有没有说清楚。。
如图:


代码附上。。。
其他高手有其他算法可以交流。。。{:soso_e181:}
  1. <p>
  2. /*
  3. 题目:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,
  4. 找出这三个数中的任一个。比如数组元素为【1, 2,4,5,6,4,2】,
  5. 只有1,5,6这三个数字是唯一出现的,
  6. 我们只需要输出1,5,6中的一个就行。

  7. */

  8. class  screen{
  9.         
  10.         public void get(int[] arr)
  11.         {
  12.                 //定义两个数组用来存储和记录 copy[] 用来复制一遍输入数组 record[] 用来存储数组相同元素出现次数
  13.                 //counter 用来记录出现次数
  14.         int counter=0;
  15.         int record[] = new int[arr.length];
  16.                 //遍历数组元素
  17.                 for (int x=0;x<arr.length;x++)
  18.                 {
  19.                         for (int y=0;y<arr.length;y++)
  20.                         {
  21.                                 if(arr[x]==arr[y])//比较是否相同,本来还有选择性不和自身比较,最后比较懒,没写。。。
  22.                                 {
  23.                                         counter++;
  24.                                 }
  25.                         }
  26.                          record[x]=counter;        //用数组记录下元素出现次数
  27.                          counter=0;//计数器归零,很重要
  28.                 }
  29.                 System.out.println();
  30.                
  31.                 //找到出现多次的元素
  32.                 //遍历数组
  33.                 //查看下定义的数组是否记录准确
  34.                 //System.out.print("record.lenth="+record.length) ;         
  35.                
  36.                 /*for (int x=0;x<arr.length;x++)
  37.                 {
  38.                         System.out.print("record ["+x+"]="+record [x]+",");
  39.                         System.out.println();
  40.                 }*/
  41.                 System.out.println();
  42.                 System.out.print("单次出现的元素是");
  43.                 for (int x=0;x<arr.length;x++)
  44.                 {
  45.                         if(record[x]==1)
  46.                         {
  47.                         System.out.print(arr[x]+",");
  48.                         }
  49.                 }
  50.         }
  51.         
  52. }        


  53. public class screenText
  54. {
  55.         public static void main(String[] args)
  56.         {
  57.                 int arr[]={1, 2,4,5,6,4,2};
  58.                 screen sc=new screen();
  59.                 sc.get (arr);
  60.         }
  61. }
复制代码

评分

参与人数 1技术分 +3 收起 理由
admin + 3 加分再看

查看全部评分

11 个回复

倒序浏览
学习了,新手
回复 使用道具 举报
王龙 发表于 2012-10-27 22:51
学习了,新手

我也新手。。。
回复 使用道具 举报
对于这种需要数据出现次数的程序,我觉得map集合比较合适
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class ArrTest {
public static void main(String[] args){
    int arr[]={1, 2,4,5,6,4,2};
    ArrOpertation.getSingle(arr);
}
}
class ArrOpertation{
public static void getSingle(int arr[]) {
  TreeMap<Integer, Integer> tm=new TreeMap<Integer, Integer>();
  for(int i=0;i<arr.length; i++){
   if(tm.get(arr[i])==null)
    tm.put(arr[i], 1);
   else
    tm.put(arr[i], tm.get(arr[i])+1);
  }
  StringBuilder sb=new StringBuilder();
  Set<Map.Entry<Integer, Integer>> entrySet=tm.entrySet();
  Iterator<Map.Entry<Integer, Integer>> it=entrySet.iterator();
  while(it.hasNext()){
   Map.Entry<Integer, Integer> me=it.next();
   if(me.getValue()==1)
    sb.append(me.getKey()+",");
  }
  sb.deleteCharAt(sb.length()-1);
  System.out.println("只出现唯一次的数有:( "+sb.toString()+")");
  System.out.println(sb.charAt(0)+" 是只出现一次的数字之一!");
}

}
回复 使用道具 举报
本帖最后由 blueice 于 2012-10-28 00:10 编辑

学习了,很好
回复 使用道具 举报
  1. import java.util.*;
  2. class  Interview
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int[] arr = {1,2,4,5,6,4,2};
  7.                 print(arr);
  8.         }
  9.         public static void print(int[] arr){

  10.                 List<Integer> list = new ArrayList<Integer>();

  11.                 for(int i = 0;i<arr.length;i++){

  12.                         Object num = arr[i];        //num为Object,否则会按角标删除元素

  13.                         if(list.contains(num)){

  14.                                 list.remove(num);

  15.                                 continue;
  16.                         }else{

  17.                                 list.add(num);
  18.                         }

  19.                 }

  20.                 System.out.println(list);
  21.         }
  22. }
复制代码

点评

容器吗? 好吧,我忘记了。。 学习了。。  发表于 2012-10-28 09:41
回复 使用道具 举报
  1. public class arrCount {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 int[] arr = {1,2,4,5,6,4,2};
  8.                 printarr(arr);
  9.         }
  10.         public static void printarr(int[] arr){
  11.                 Map<Integer,Integer> map = new TreeMap<Integer,Integer>();
  12.                 int count = 1;
  13.                 for(int x=0;x<arr.length;x++){
  14.                         if(map.put(arr[x], count) != null){
  15.                                 int temp = map.put(arr[x], count);
  16.                                 map.put(arr[x], temp+1);
  17.                         }                       
  18.                 }
  19.                 Set<Map.Entry<Integer,Integer>> entrySet = map.entrySet();
  20.                 Iterator<Map.Entry<Integer,Integer>> it = entrySet.iterator();
  21.                 for(;it.hasNext();){
  22.                         Map.Entry<Integer, Integer> me = it.next();
  23.                         int key = me.getKey();
  24.                         int value = me.getValue();
  25.                         //System.out.println(key+"="+value);
  26.                         if(value == 1){
  27.                                 System.out.print(key+",");
  28.                         }
  29.                 }
  30.         }
  31. }
复制代码

点评

回复每次都会置顶,就不直接回复了哈。。 MAP,我还没看到。。学习了。。呵呵  发表于 2012-10-28 09:39
回复 使用道具 举报
本帖最后由 杨雪松 于 2012-10-28 01:22 编辑
  1. class Zhao
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr={1,2,4,5,6,4,2};
  6.                 for (int x=0;x<arr.length-1 ;x++ )//冒泡排序
  7.                 {
  8.                         for (int y=0;y<arr.length-x-1 ;y++ )
  9.                         {
  10.                                 if (arr[y]>arr[y+1])
  11.                                 {
  12.                                         int b=arr[y];
  13.                                         arr[y]=arr[y+1];
  14.                                         arr[y+1]=b;

  15.                                 }
  16.                         }
  17.                 }
  18.                 for (int x=0;x<arr.length-1 ;x++ )
  19.                 {
  20.                         if(arr[x]!=arr[x+1])//找不同...
  21.                         {
  22.                                 System.out.println("其中一个为:"+arr[x]);
  23.                                 break;
  24.                         }

  25.                 }
  26.         }
  27. }
复制代码
新手一枚 上面的都看不懂- -
之前学过的冒泡排序,感觉可以找找...

点评

你有测试下吗? 我运行了下,结果是:其中一个为:1 感觉最后的if 貌似不是太对。 还有就是break, 排序完毕筛选相邻相同思路,,学习了。  发表于 2012-10-28 09:38
回复 使用道具 举报
徐梦侠 发表于 2012-10-27 23:17
对于这种需要数据出现次数的程序,我觉得map集合比较合适
import java.util.Iterator;
import java.util.Ma ...

map 我还没看到。。。
先make 下。。
:handshake
回复 使用道具 举报
杨雪松 发表于 2012-10-28 01:16
新手一枚 上面的都看不懂- -
之前学过的冒泡排序,感觉可以找找...

因为题目要求找出一个就行
如果都列出来应该是arr[x-1]!=arr[x]&&arr[x]!=arr[x+1]
也就不用break了;
so
回复 使用道具 举报
可以先实现排序,然后比较一个数字的前后数字是否相等,这样是否会好点!?
回复 使用道具 举报
黑马吕世成 发表于 2012-10-28 20:57
可以先实现排序,然后比较一个数字的前后数字是否相等,这样是否会好点!? ...

恩,可以的.
我这样写,为了考虑如果筛选出现其他次数的情况,修改计数器就O了。。
面试题而已,都可以,,呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马