【问题标题】:String Occurrence According to the order字符串出现按顺序
【发布时间】:2019-09-27 06:05:44
【问题描述】:

我有一个问题,我需要根据它们在给定字符串中出现的顺序找到第一次出现的字符。

例如:

我有一个字符串 "Unitedin",其中字符 "n""i" 在字符串中多次出现。 char n 发生在 charAt(1,7) char i 发生在 charAt (2,6) 但是 char "i" 先出现在 char "n" 之前。

我已经尝试过这样的事情但是我没有得到所需的输出。有人可以帮帮我吗? 注意:挑战是不要使用任何类型的 List 或 Hashset 或 Hashmap

    public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            StringBuilder nodup = new StringBuilder();
            StringBuilder dup = 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)) {
                        nodup.append(instring.charAt(i));

                    } else {
                        dup.append(instring.charAt(i));
                    }
                }

            }
            System.out.print(nodup.toString());

我得到的输出为:ni。但所需的输出是 in

【问题讨论】:

  • “Unitedin”中的第一个“n”出现在“Unitedin”中的第一个“i”之前,所以如果我理解正确,“ni”是正确的。你能澄清一下吗?
  • 你说的char按照顺序第一次出现是什么意思——哪个char,哪个顺序?
  • @Neil 如果您扫描给定字符串中的字符,i 的出现首先是 n。希望我澄清。
  • @Armali 在给定的字符串中,我们有一组字符 u``n``i``tedin。是字符串中的字符。在这里,您可以看到第一次出现i 的顺序首先是n。希望对您有所帮助。
  • @dev2kun 我想我明白你的意思。我提交了一个答案。请告诉我。

标签: java string substring


【解决方案1】:

LinkedHashMap 类非常适合您的特定问题。您可以从输入字符串中迭代字符数组,然后将字符及其计数作为键添加到LinkedHashMap 中。由于LinkedHashMap 保留了插入顺序,因此要获得所需的输出,您只需迭代映射并打印出所有计数大于一的键。字符键的顺序将在每个字母的第一次出现时固定。

String input = "Unitedin";
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
for (char chr : input.toCharArray()) {
    Integer count = map.get(chr);
    map.put(chr, count == null ? 1 : count + 1);
}
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
    if (entry.getValue() > 1) System.out.println(entry.getKey());
}

打印出来:

n
i

【讨论】:

  • 感谢您的帮助。 @Tim Biegeleisen,但我们不应该使用任何类型的 ListHashsetHashmap 。对不起,我忘了提到问题
  • 无赖,我有个好主意。我会留下这个,除非我得到一些反对意见。
【解决方案2】:

如果您的目标是查看角色的第一次重复,那么应该这样做。该顺序将是在您的字符串中找到 repeated 字符的顺序。

String input = "Unitedin";
Stringbuilder sb = new Stringbuilder();
Map<Character, Integer> map = new HashMap<>();
for (char chr : input.toCharArray()) {
    Integer count = map.get(chr);
    count = count != null ? count + 1 else 1;
    map.put(chr, count);

    if(count > 1) {
        sb.append(chr);
    }
}

System.out.println(sb.toString());  // Output:  in

编辑:我从您的评论中了解到您不能使用 List、HashSet 或 HashMap 的实例?那么是否允许 LinkedHashMap?如果没有,那么您将需要以某种方式重新创建该功能。

您可以将字符 a-z 和 A-Z 映射到 52 (26 + 26) 的 int 数组中。不是将计数插入到映射中,而是将字符映射到数组中的适当位置并更新计数。祝你好运!

【讨论】:

  • 感谢您的帮助。但挑战是不要使用任何类型的 List 或 Hashset 或 Hashmap。 @尼尔
  • 有什么逻辑要解决吗?它在我的头上。真的很有帮助!
  • @dev2kun 我更新了我的答案。希望这将为您指明正确的方向!
  • 对不起,我们也不能使用它!但我有一个不知道如何实现的逻辑。你能帮助我吗?我会通过它@Neil
  • 我们可以使用int m = input.indexOf('instring.charAt(i) ', startingindex) - i,它会返回一个值。我们需要同时存储值 mi 不知道该怎么做。然后值 m 哪个更小。打印字符(i)。希望你明白。但是需要帮助如何实现@Neil
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多