关于字符串的一个题

求第一个无重复字符,如"total"的第一个无重复字符是o,"teeter"的第一个无重复字符是r,效率要优于O(n的平方)

public static Character FirstNonRepeated(String)



两个方法,第一个比较好理解:

1:

public class Test {    
    public static void main(String[] args) {    
    System.out.println(getChar("a*faskf"));      
    }   
    public static char getChar(String text){  
        char c =0xff;  
        for(int index =0;index <text.length();index ++){  
            c =text.charAt(index);  
            if(text.indexOf(c) ==text.lastIndexOf(c)) 
            break;  
        }  
        return c;  
        }  
}                                                             //由于用到了很多方法,所以时间复杂度略高,

0x开头表示的是16进制
0xff转换成10进制就是255    


2:

public class Test {  
public static void main(String[] args) {      
    System.out.println(FirstNonRepeated("atdaskf"));      
   }                
public static Character FirstNonRepeated(String str) {
       int[] counter = new int[128];        
       for (int i = 0; i < str.length(); i++) {
           char ch = str.charAt(i);
           counter[ch]++;;                        //“counter[ch]”,由于这里的ch是单个字符,作为数组下标时,会被自动转化为对应的ASCII值(也就是int类型的整数),
       }                                           //counter[]下标是从0开始,所以找到的字母需要加1,两个的时候就是2了
       for (int i = 0; i < str.length(); i++) {
           char ch = str.charAt(i);


           if(counter[ch] == 1)                             
               return ch;
       }
       return null;    
}
}                                                               //我只能说这个思路很牛,一些注释我也加在代码中了,时间复杂度也很低



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值