不使用hashmap查找第一个非重复字符

时间:2015-04-05 09:06:54

标签: java

我想在字符串中找到第一个非重复字符。我写了以下函数,其中我一度陷入困境。 Google告诉我这方面的hashmap方法,但如果有人可以帮我处理我的代码,我将不胜感激。

public static Character firstNonRepeatedChar(String line) {

        Character c = null;
        int strLength = line.length();

        for (int i =0; i<strLength-1; i++){

            int flag = 0;
            for(int j = i+1; j<strLength-i; j++){

                if(line.charAt(i) == line.charAt(j)){
                    flag++;
                    break;
                }
                else
                    continue;
            }

            if (flag==0){
                c = line.charAt(i);
                break;
            }


        }
        return c;
    }
}

问题:如何检查已经检查过一次的重复字符是否再次被检查。 例如:如果我的字符串是“hhello”,那么代码首先将索引0处的h与所有其他字符进行比较。因为它重复外部for循环的下一次迭代,所以我现在指向字符串的索引1,即重复的h,并将其与其余元素进行比较。由于它没有得到重复的实例,因此将“h”作为非重复字符返回,这是错误的。

我该如何解决这个问题?有什么办法吗? 请帮忙

编辑:重复角色不一定是下一个角色。 例如:在字符串“helloWorld”中,字符“l”和“o”正在重复。     在字符串“hehelo”中,字符'h'和'e'重复,第一个非重复字符将是'l'

5 个答案:

答案 0 :(得分:1)

提示 1:重复字符 1 是与字符串中的前一个字符相同的字符。非重复的字符是.........

实施!

提示2 :您需要嵌套循环。


<强>更新

我明白了。所以你正在使用&#34;非重复字符&#34;意味着与大多数人的意思不同的东西。您实际寻找的是第一个在整个字符串中只出现一次的字符。

无论如何......至少我现在明白为什么你现在使用嵌套循环,我理解这个错误。

提示3 :即使字符在字符串中出现多次,它在最后一次出现后仍会出现ZERO次。

这就是你的内循环测试的内容。所以你发现的是字符串中的第一个字符,它不会在字符串的其余部分重复。

修复很简单......一旦你了解你做错了什么。


一旦你修复了其他一些整洁的东西:

  • else continue是多余的。

  • c变量是不必要的......如果您更改:

        if (flag==0){
            c = line.charAt(i);
            break;
        }
    

        if (flag==0){
            return line.charAt(i);
        }
    

        return c;
    

        return null;
    

1 - 这是英语母语人士所理解的#34;找到第一个不重复的字符&#34;。你可能意味着别的东西。如果是,请更新问题以澄清。请尽可能清楚地描述您的意思。请举例。

答案 1 :(得分:1)

***对于所有重复案例

Character c = null;
    int strLength = line.length();

    for (int i = 0; i < strLength; i++) {

        int flag = 0;
        for (int j = 0; j < strLength; j++) {
            if (line.charAt(i) == line.charAt(j) && i != j) {
                flag = 1;
                break;
            }
        }

        if (flag == 0) {
            c = line.charAt(i);
            break;
        }

    }
    return c;

这很容易检查,你的逻辑很复杂。试试这个立即重复的角色。

Character c = null;
        int strLength = line.length();

        for (int i = 0; i < strLength - 1;) {

            int flag = 0;
            int present_char_position = 0;

            if (line.charAt(i) == line.charAt(i + 1)) {
                flag++;
                present_char_position = i;
                i += 2;//jumping from those two character if matched
                continue;
            } else {
                present_char_position = i;
                i++;//if not matched go to next character
            }

            if (flag == 0) {
                c = line.charAt(present_char_position);
                break;
            }

        }
        return c;

答案 2 :(得分:0)

标记doublets的最简单方法是用无可打印的字符替换字符。然后,您可以跳过这些职位。但是这会在循环中添加另一个O(n)来替换字符。最坏的情况会导致O(n ^ 3)。优化你可以编写一个内部循环,只替换当前位置之前的字符。这将再次导致O(n ^ 2),因为目前你有O(n ^ 2)(n * n / 2)。

<强>更新 添加了代码并修复了一个错误,其中非重复字符位于String的最后位置。 现在处理String

,而不是处理char[]
private static final char FLAG = '\u0000';

public static Character firstNonRepeatedChar(String line)
{
    final char[] chars = line.toCharArray();
    Character c = null;

    final int strLength = chars.length;

    for (int i = 0; i < strLength; i++)
    {
        if (chars[i] == FLAG)
        {
            continue;
        }

        int flag = 0;
        for (int j = i + 1; j < strLength; j++)
        {
            if (chars[i] == chars[j])
            {
                flag++;
                chars[j] = FLAG;
            }
        }

        if (flag == 0)
        {
            c = chars[i];
            break;
        }
    }
    return c;
}

答案 3 :(得分:0)

以下方法将返回您正在查看的内容。

public static char getFirstNonRepeatedChar(String input) {        
    char c = 0;
    for (int i =0; i<input.length(); i++){
        int flag = 0;
        for(int j = 0; j<input.length(); j++){
            if(input.charAt(i) == input.charAt(j)){
                flag++;
            }
            if(flag>1)
                break;
        }
        if (flag == 1){
            c = input.charAt(i);
            break;
        }
    }
    return c;
}

答案 4 :(得分:0)

这是PHP的

<?php

$string = "ABBGAACCE";

$stringArray = str_split($string); // string converted to array
$temp_array = [];
$non_repeating_array = get_first_non_repeating($stringArray, $temp_array);

echo reset($non_repeating_array); // display first non repeating character from string

function get_first_non_repeating($stringArray, $temp_array)
{
    $repeating = []; // store all repeating characters
    foreach($stringArray as $key => $char)
    {
        if(array_key_exists($char, $temp_array)) // check if character was already saved meaning it is repeating
        {
            array_push($repeating, $char); // push all repeating character in a variable
            $stringArray = array_diff($stringArray, $repeating); // subtract repeating characters from the string array
        }else{
            $temp_array[$char] = 1;
        }
    }
    return $stringArray; // returns the non repeating characters
}