黑马程序员技术交流社区

标题: 去腾讯面试时候的一道关于字符串的笔试题, [打印本页]

作者: 肖鸿耀    时间: 2012-6-14 23:10
标题: 去腾讯面试时候的一道关于字符串的笔试题,
本帖最后由 krui 于 2012-6-15 00:06 编辑

题目:
找出一个字符串中第一个无重复的字符。
我当时的做法是这样的:
String str = "afaafdafaaaaaaaaaaafdrmnnnnabbbb";
               
                char[] w = str.toCharArray();
                for (int i = 0; i < str.length(); i++) {
                        if (w.length - str.replace(String.valueOf(w), "").length() == 1) {
                                System.out.println(w);
                                break;
                        }
                }

后面回来的时候,又找到另外一种解法,

String testStr = "afaafdafaaaaaaaaaaafdrmnnnnabbbb";
               
                for(int i=0;i<testStr.length();i++){
            String charindex = String.valueOf(testStr.charAt(i));

            //如果这个字符第一次出现的位置和最后出现的位置相等,就说明字符串中它只出现了一次
            if(testStr.indexOf(charindex) == testStr.lastIndexOf(charindex)){
                System.out.println(charindex);
                break;
            }
            
        }

各位同学不知道还有没有更好的方法,欢迎交流。

作者: 张頔    时间: 2012-6-14 23:36
{:soso_e179:}
作者: 柯玲    时间: 2012-6-14 23:43
不清楚这些代码是网上抄下来的呐,还是确实有过这种面试经历?
作者: 肖鸿耀    时间: 2012-6-15 00:02
柯玲 发表于 2012-6-14 23:43
不清楚这些代码是网上抄下来的呐,还是确实有过这种面试经历?

腾讯成都校园招聘4月14号技术面一面面试,现场笔试,面试官一华科毕业的做客户端的眼镜男。一来就问我愿意做客户端不,我说不擅长C++。后来问了几个底层相关的,大端存储与小端存储是怎样的回答不上来
作者: 揭耀祖    时间: 2012-6-15 00:41
我想到一种方法,效率比较低下而已,就是把第一个字母和所有的比,然后又把第二个和所有的字母比,第三个.......依此类推,当发现有一个字母没有和任何一其它的字母相等时,就退出循环并打印。代码如下:
public static void method()
{
     String str = "afaafdafaaaaaaaaaaafdrmnxyznnnabbbb";
             char[] w = str.toCharArray();
    int sign = 0;          //定义一个标记
    for(int i = 0;i<w.length;i++)
       {
                 for(int j=0;j<w.length;j++)
                {  
                           if(i==j)      //为了避免自己和自己比较
                            j++;
                        if(j<w.length)   //为了避免数组角标越界
                        {
                               if((String.valueOf(w[i])).equals(String.valueOf(w[j])))  
                             sign++;     //当有相等的时候就加一
                        }
     
               }
                if(sign==0)     //sign==0说明当前字符没有任何其它字符与它相等,而我们要的就是它。
               {
                     System.out.println(w[i]);
                      break;   //退出循环
               }
             sign=0;
       }
}

作者: 武剑峰    时间: 2012-6-15 09:25
本帖最后由 武剑峰 于 2012-6-15 09:35 编辑

呵呵,我用递归实现了一下
public class findCFChar {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String str1="ttttfasdfhjasdf";
                System.out.println(findcf(str1));
        }
        /*
         * 查找给定字符串中第一个重复的字符
         */

        private static char findcf(String str1) {
                // TODO Auto-generated method stub
                if(str1.length()>1){                       //先判断字符串长度是否大于1
                String strcf=str1.substring(0,1);    //截取第一字符
                String strzz=str1.substring(1);      //截取第一字符之后的字符串
                if(strzz.indexOf(strcf)!=-1){           //判断第一字符是否在后边中出现过,没有就返回-1,有则将此字符返回到主方法中
                        return strcf.charAt(0);
                }else{
                        return findcf(strzz);                //将后边的字符递归继续查找
                        }
                }else {
                       System.out.print("此字符串中不存在重复字符");
                        return '0';
                         }
               
        }

}

作者: 史卜坤    时间: 2012-6-15 10:18
public class firstNoRepit {   
      
    public static void main(String[] args) {   
           
        String str="afaafdafaaaaaaaaaaafdrmnnnnabbbb";   
           
        System.out.println(firstNo( str));   
    }   
      
    public static Character firstNo(String str){   
           
        Map <Character,Integer> map = new HashMap<Character,Integer>();   
           
        for(int i=0; i<str.length();i++){   
               
            if(map.containsKey(str.charAt(i))){   
                  
                 map.put(str.charAt(i), 2);     
                  
            }
           else{   
                  
                 map.put(str.charAt(i), 1);   
            }   
               
               
        }   
        for(int i=0; i<str.length();i++){   
               
            if(map.get(str.charAt(i))==1 ){   
                  
                return str.charAt(i);   
            }   
        }   
           
        return null;   
    }   
  
}  

作者: 王明明    时间: 2012-6-15 10:40
本帖最后由 王明明 于 2012-6-15 10:45 编辑
  1. public class Demo
  2. {
  3.        public static void main(String args[])
  4.       {
  5.              String str="afaafdafaaaaaaaaaaafdrmnnnnabbbb";
  6.              for(int i = 0; i < str.length(); i++)
  7.             {
  8.                      if(str.lastIndexOf(str.charAt(i)) == i && str.indexOf(str.charAt(i)) == i)
  9.                     {
  10.                             System.out.println(str.charAt(i));
  11.                             break;
  12.                     }
  13.              }
  14.       }
  15. }
复制代码
跟你第二种想法一样的...

作者: 逝去的记忆ヽ    时间: 2012-6-15 11:08
我是通过list方法去做的。不知道效率如何,反正是一种方法吧。 分享


class ListDemo{
public static void main(String[] args) {
        char ch;
        int char_index = 0;
        String str = "afaafdafaaaaaaaaaaafdrmnnnnabbbb";
        List<Character> strList = new ArrayList<Character>();
        List<Character> haveList = new ArrayList<Character>();
        for(int i = 0; i < str.length(); i++){
            ch = str.charAt(i);
            char_index = strList.indexOf(ch);
            if(haveList.indexOf(ch) >= 0 && strList.indexOf(ch) >= 0){
                strList.remove(char_index);
            }else{
                haveList.add(ch);
                strList.add(ch);
            }
        }
        
        if(strList.size() != 0){
            System.out.println(strList.get(0));
        }else{
            System.out.println("不存在这样的数据");
        }
    }
}
作者: 王连正    时间: 2015-8-3 17:05
不知道用封装的方法效率高还是自己写的效率高
作者: qq897425998    时间: 2015-8-16 21:13
揭耀祖 发表于 2012-6-15 00:41
我想到一种方法,效率比较低下而已,就是把第一个字母和所有的比,然后又把第二个和所有的字母比,第三个.. ...

break; 减少循环次数
作者: xiaoxiaofei    时间: 2015-8-31 00:26
刚学习,表示完全看不懂




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2