只使用for循环和赋值的方式对字符串进行去重

       近,有个朋友去面试时让一道笔试题给难住了,具体的代码要求当时写出来,考的是非常基础的东西,但是个人感觉这道题非常有意思,话不多说上题目:要求对一串没有任何规律的字符串,例如aassgtgfaagsds,对这个字符串首先进行去重,求出去重后的字符串,其实对原始字符串进行字符统计,统计出每一个字符在这个字符串中出现的次数,最后是将去重后的字符串进行排序,这个题目猛一看貌似很简单,但是最后来了一条要求,就是说只能使用for循环和赋值的方法,任何别的方法都不让用,这个就是考验for循环的逻辑能力了,在这里分享一下自己实现的过程:

public class TestString {
    public static void main(String[] args) {
        String str = "aassgtgfaagsds";
        String strs = getChars(str);
        System.out.println("去掉重复后的字符为" + strs);
        String soryByfor = soryByfor(strs);
        System.out.println("排序后的字符为:"+soryByfor);
        String num = getNum(str);
        System.out.println(num);
    }

    /**
     * 对字符串进行倒序排序
     */
    static String soryByfor(String str) {
        char[] arr = new char[50];
        String strs = "";
        for (int i = 0; i < str.length(); i++) {
            arr[i] = str.charAt(i);
        }
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] >= arr[j+1]) {
                    char temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int x = 0;x<arr.length;x++){
            strs+=arr[x];
        }
        return strs.trim();
    }
    /**
     * 计算字符串中每个字符出现的次数 通过循环和赋值
     */
    static String getNum(String str) {
        char[] exitsChar = {};
        String string = "";
        for (int i = 0; i < str.length(); i++) {
            //判断是否被计算过的标识
            boolean flag = false;
            int count = 0;

            if (!ifExits(exitsChar, str.charAt(i))) {
                for (int j = 0; j < str.length(); j++) {
                    if (str.charAt(i) == str.charAt(j)) {
                        count++;
                    }
                }
                //将每一次计算后的字符存入数组中
                exitsChar = saveToArr(exitsChar, str.charAt(i));
                string += str.charAt(i) + "->" + count + " ";
            }
        }
        return string;
    }

    /**
     * 通过循环和赋值去掉字符串中的重复字符
     *
     * @param str
     * @return 
     */
    private static String getChars(String str) {
        char[] chars = {};
        String strs = "";
        for (int i = 0; i < str.length(); i++) {
            char x = str.charAt(i);
            for (int j = 0; j < str.length(); j++) {
                char y = str.charAt(j);
                if (x != y) {
                    if (!ifExits(chars, x)) {
                        chars = saveToArr(chars, x);
                    }
                }
            }
        }
        for (char aChar : chars) {
            strs += aChar;

        }
        return strs;
    }

    public
    /**
     * 判断一个字符是否存在于一个数组中
     */
    static boolean ifExits(char[] arr, char s) {
        boolean flag = false;
        for (char c : arr) {
            if (c == s) {
                flag = true;
            }
        }
        return flag;
    }

    /**
     * 将一个字符保存到数组中
     *
     * @param arr
     * @param s
     * @return
     */
    static char[] saveToArr(char[] arr, char s) {
        char[] saveArr = new char[arr.length + 1];
        for (int i = 0; i < arr.length; i++) {
            saveArr[i] = arr[i];
        }
        if (arr.length + 1 == 1) {
            saveArr[0] = s;
        } else {
            saveArr[arr.length] = s;
        }
        return saveArr;
    }
}
程序运行后的结果如下:

 

中间最重要的方法就是向一个字符数组中插入一个新的字符,并且返回一个新的字符数组,另外一个就是判断字符是否存在于一个字符串中,这两个最为基本的方法为之后的方法提供了很多便利。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值