【问题标题】:Difference between first index and last index of the char in the given string给定字符串中字符的第一个索引和最后一个索引之间的差异
【发布时间】:2019-09-27 12:52:20
【问题描述】:

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

我需要按照输出端差值的升序打印字符。

挑战是我不能使用任何类型的 数组列表或列表或 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

【问题讨论】:

  • 你的最后一个索引差了一个。
  • @Tom 我没听懂你..你能更正我的代码吗?或任何其他逻辑?
  • @Mushif Ali Nawaz 你能帮帮我吗?
  • 你能用array吗?
  • 是的,你可以@oleg.cherednik 但不是arrayList!

标签: java string substring


【解决方案1】:

像那样。这不是最好的性能,但它没有使用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();

【讨论】:

    【解决方案2】:
    
    import java.util.TreeMap;
    import java.util.Scanner;
    
    public class SameCharOccurenceDiff {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int firstIndex = 0;
            int lastIndex = 0;
            TreeMap<Integer,Character> outputMap = new TreeMap<Integer,Character>();
            String stringInput = sc.next();
            StringBuilder strBuilder = new StringBuilder(); 
            sc.close();
            for (int i = 0; i < stringInput.length(); i++) {
                char chr = stringInput.charAt(i);
                firstIndex = stringInput.indexOf(chr);
                lastIndex = stringInput.lastIndexOf(chr);
                int diff = lastIndex-firstIndex; 
                if( diff > 0) {
                    outputMap.put(diff,chr);
                }
            }
            for (char c : outputMap.values()) {
                strBuilder.append(c);
            }
            System.out.println(strBuilder);
        }
    }
    

    编辑:(不使用 TreeMap)

    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.Scanner;
    
    public class SameCharOccurenceDiff {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int firstIndex = 0;
            int lastIndex = 0;
            int count = 0;
            String stringInput = sc.next().toLowerCase();
            String[] stringInputArr = new String[stringInput.length()];
            StringBuilder strBuilder = new StringBuilder(); 
            sc.close();
            for (int i = 0; i < stringInput.length(); i++) {
                char chr = stringInput.charAt(i);
                firstIndex = stringInput.indexOf(chr);
                lastIndex = stringInput.lastIndexOf(chr);
                int diff = lastIndex - firstIndex; 
                if( diff > 0 && !inArray(stringInputArr,diff+""+chr)) {
                    stringInputArr[count] = diff+""+chr;
                    count++;
                }
            }
            //System.out.println(Arrays.toString(stringInputArr));
            Arrays.sort(stringInputArr,0,count,new Comparator<String>() {
                public int compare(String s1, String s2) {
                    int num1 = Integer.parseInt(s1.replaceAll("[^\\d]", ""));
                    int num2 = Integer.parseInt(s2.replaceAll("[^\\d]", ""));
                    return num1 - num2;
                }
            });
            //System.out.println(Arrays.toString(stringInputArr));
            for (String str : stringInputArr) {
                if(str == null)break;
                strBuilder.append(str.replaceAll("\\d", ""));
            }
            System.out.println(strBuilder);
        }
        public static boolean inArray(String[] arr,String chr) {
            boolean isPresent = false;
            for (int i = 0; i < arr.length; i++) {
                if(arr[i] == null)break;
                if(arr[i].equalsIgnoreCase(chr)) {
                    isPresent = true;
                    break;
                }
            }
            return isPresent;
        }
    }
    
    

    【讨论】:

    • 如果您想忽略大小写,请使用String stringInput = sc.next().toLowerCase();
    • 兄弟请看问题。我们不应该使用任何类型的树或地图或数组列表!
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多