我想在字符串中找到第一个非重复字符。我写了以下函数,其中我一度陷入困境。 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'
答案 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
}