字符串去重,保持输出结果(笔试)

最简单的方案,放到LinkedHashSet()再输出出来,绝对的有序且去重,时间复杂度不高,hashset底层用的HashMap(),增加元素时间复杂度O(1)——O(n)

代码:ps:为了方便测试我把参数写到了方法里面

    @Test
    public void ceshi(){
        String a = "AAABBDFDAC";

        Set set = new LinkedHashSet();
        char[] chars = a.toCharArray();
        for(int i = 0 ; i < a.length() ; i ++){
            set.add(chars[i]);
        }
        System.out.println(set.toString());;
    }

时间复杂度最好的方案,而且不使用别人的东西

假定字符串是从键盘输入的,就逃不出26个字母和各种标点符号范畴,可以从编码格式角度出发,首先打印出200以内所有的字符,数字转字符看一下有哪些

代码:

    @Test
    public void ceshi2(){
        String a = "AAABBDFDAC";

        int i = 0;
        while(i<100){
            System.out.print(i+":");
            System.out.print((char)i);
            System.out.print("  ");
            i++;
        }
    }

大概从33开始有东西是个!

截止到126左右,后面就没有键盘上正常的字符了。

搞个150长的int空数组置为0;

遍历字符,根据字符ascii码10进制数代表数组下标,拿到一个码就在数组该下标位置里的值执行加一操作,如果加完1以后是1就放到StringBuffer里面。最后输出字符串。(事实上还带了统计重复出现次数的功能,但是不支持中文等,只支持普通字符)

150的数组可能有点浪费内存

@Test
public void ceshi2(){
    String a = "AAABBccDFDACggghh";
    int [] table = new int[150];
   StringBuffer sb = new StringBuffer();
    char[] chars = a.toCharArray();
    for (int i = 0 ; i < chars.length ;i++){
        int flag = (int)chars[i];   //找到
        table[flag] = ++table[flag];
        if(table[flag]==1){
            sb.append((char)flag);
        }
    }
    System.out.println(sb.toString());
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章