首页 > 解决方案 > 给定字符串中字符的第一个索引和最后一个索引之间的差异

问题描述

我有一个字符串Unitedin。这里 char "n" 出现在索引 1 和索引 6 处;索引号之间的差异为 5 类似地,“i”出现在索引 2 和索引 5 处。差异为 3。

我需要根据输出端差异的升序打印字符。

挑战是我不能使用任何类型的数组列表或 List 或 hashMap 或设置或链接哈希等

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    StringBuilder temp = new StringBuilder();
    StringBuilder output = new StringBuilder();
    System.out.println("Enter a string : ");
    String instring = in.next();
    for (int i = 0; i < instring.length(); i++) {
        for (int j = i + 1; j < instring.length(); j++) {
            if (instring.charAt(i) == instring.charAt(j)) {
                temp.append(instring.charAt(i));
            }
        }
    }

    for (int m = 0; m < temp.length(); m++) {
        for (int p = m + 1; p < temp.length(); p++) {
            if (m == temp.length() - 1) {
                output.append(temp.charAt(m));
            } else if (instring.lastIndexOf(temp.charAt(m), 0) >= instring.lastIndexOf(temp.charAt(p), 0)) {
                output.append(temp.charAt(p));
            } else {
                output.append(temp.charAt(m));
            }
        }
    }
    System.out.println(output);
}

我将输出作为i. 谁能帮我?预期产出 =in

标签: javastringsubstring

解决方案


嗯。像那样。这不是最好的性能,但它不使用Collections

public static String foo(String str) {
    str = str.toLowerCase();

    int[] letters = new int[26];
    Arrays.fill(letters, Integer.MIN_VALUE);

    for (int i = 0; i < str.length(); i++)
        if (letters[str.charAt(i) - 'a'] == Integer.MIN_VALUE)
            letters[str.charAt(i) - 'a'] = -i;

    for (int i = str.length() - 1; i >= 0; i--)
        if (letters[str.charAt(i) - 'a'] != Integer.MIN_VALUE)
            letters[str.charAt(i) - 'a'] += i;

    return IntStream.range(0, letters.length)
                    .filter(i -> letters[i] > 0)
                    .boxed()
                    .sorted(Comparator.comparingInt(i -> letters[i]))
                    .map(i -> String.valueOf((char)('a' + i)))
                    .collect(Collectors.joining());
}

如果您不想使用Streams,那么第二部分:

int cur = 1;
boolean checkNext;
StringBuilder buf = new StringBuilder();

do {
    checkNext = false;

    for (int i = 0; i < letters.length; i++) {
        if (letters[i] < cur)
            continue;

        checkNext = true;

        if (letters[i] == cur)
            buf.append((char)('a' + i));
    }

    cur++;
} while (checkNext);

return buf.toString();

推荐阅读