第一个重复字符串java
好的,我知道这个问题在这里被问了很多次,但我仍然不明白,如何找到字符串中第一个重复的字符? 我做了一件很接近的事情,但它给了我所有重复的字符,而不是第一个。 以下是我所做的:第一个重复字符串java,java,string,Java,String,好的,我知道这个问题在这里被问了很多次,但我仍然不明白,如何找到字符串中第一个重复的字符? 我做了一件很接近的事情,但它给了我所有重复的字符,而不是第一个。 以下是我所做的: private static void stringChar(){ String s = "sababa"; int count = 0; char c[] = s.toCharArray(); System.out.println("Duplicate characters are :"
private static void stringChar(){
String s = "sababa";
int count = 0;
char c[] = s.toCharArray();
System.out.println("Duplicate characters are :");
for(int i = 0; i < s.length(); i++){
for(int j = i + 1; j < s.length(); j++){
if(c[i] == c[j]) {
System.out.println(c[j]);
count++;
break;
}
}
}
}
private static void stringChar(){
字符串s=“sababa”;
整数计数=0;
char c[]=s.toCharArray();
System.out.println(“重复字符为:”);
对于(int i=0;i
如果已经找到重复字符,则需要中断外部循环
boolean found = false;
for(int i = 0; i < s.length(); i++){
for(int j = i + 1; j < s.length(); j++){
if(c[i] == c[j]) {
System.out.println(c[j]);
found = true;
break;
}
}
if (found) {
break;
}
}
boolean-found=false;
对于(int i=0;i
如果你想数一数的话
int count = 0;
char repeatingChar = '0'; //dummy to overcome compiler warning
for(int i = 0; i < s.length(); i++){
for(int j = i + 1; j < s.length(); j++){
if(c[i] == c[j]) {
repeatingChar = c[j];
count++;
}
}
if (count > 0) {
System.out.println("Repeating char is " + repeatingChar + ". Occurred " + count + " times");
break;
}
}
int count=0;
char repeatingChar='0'//克服编译器警告的虚拟方法
对于(int i=0;i0){
System.out.println(“重复字符为“+repeatingChar+”。发生“+count+”次”);
打破
}
}
想到的一个快速而肮脏(但有效)的方法是维护一个以字符为键的地图。在这种情况下,我们甚至不需要正式的映射,因为我们可以使用一个整数数组映射到字符的底层ASCII值
这里的基本思想是遍历字符串,并检查数组(如果我们以前见过)。如果是,则打印该字符并退出
int[] nums = new int[128]; // assuming only basic ASCII characters
String str = "stuff";
for (int i=0; i < str.length(); ++i) {
int index = str.charAt(i);
if (nums[index] != 0) {
System.out.println("The first repeated character is: " + str.charAt(i));
break;
}
++nums[index];
}
int[]nums=newint[128];//仅假设基本ASCII字符
String str=“stuff”;
对于(int i=0;i
在迭代字符串中的字符时,第一个重复的字符是您以前看到的字符。您可以跟踪第一次看到带有布尔数组的字符。数组用char值编制索引。Java会自动将字符“加宽”为int。因此,对于每个字符,检查它之前是否被看到,如果没有,则标记它已经被看到
String s = "sababa";
boolean[] seenChars = new boolean[Character.MAX_VALUE + 1]; // initialized to all false.
for (char c : s.toCharArray()) {
if (Character.isSurrogate(c)) throw new IllegalArgumentException("No first char seen before seeing a surrogate. This algorithm doesn't work for codepoints needing surrogates in UTF-16.");
if (seenChars[c]) {
System.out.println("First repeated char is: " + c);
break;
}
seenChars[c] = true;
}
你可能注意到我说的是char而不是character。性格不是一个定义明确的术语。Java的文本数据类型使用字符集的UTF-16编码。某些Unicode代码点需要两个代码单元(
char
),有时称为代理项对。由于它们并非作为单个字符都是唯一的,因此如果它们存在,则该算法不起作用。例如,尝试String s=“sab简短>
void findFirstDupChar() {
String s = "google";
Integer dupIndex = s.length() - 1;
boolean isDuplicateExists = false;
Map<Character, Integer> map = new LinkedHashMap<>();
char[] words = s.toCharArray();
for (int i = 0; i < words.length; i++) {
Integer index = map.put(words[i], i);
if (index != null) {
if (index < dupIndex) {
dupIndex = index;
isDuplicateExists = true;
}
}
}
System.out.println(isDuplicateExists ? words[dupIndex] + ", index=" + dupIndex : "No duplicateds found");
}
void findFirstDupChar(){
字符串s=“谷歌”;
整数dupIndex=s.length()-1;
布尔值isDuplicateExists=false;
Map Map=newlinkedhashmap();
char[]words=s.toCharArray();
for(int i=0;i
这将按如下方式打印输出>
g、 index=0如果不使用嵌套for循环,我如何解决这个问题?必须有某种方法来解决这个问题,或者使用1 for循环,或者使用2分隔for循环。@JohnMason您可以使用一个映射或列表,如Tim Biegeleisen的回答所示。如何使用HashSet?@JohnMason使用HashSet
或HashSet
。