我想在String中打印重复字符时不使用HashMap或Set。但在解决方案中,即使它们是重复的,我也会使用我打印的所有字符。我想打印每个字符一次,并在字符串中出现次数。这是我的榜样:
public static void printDups(String s1) {
int count = 0;
for (int i = 0; i < s1.length(); i++) {
for (int j = 0; j < s1.length(); j++) {
if (s1.charAt(i) == s1.charAt(j)) {
count++;
}
}
System.out.println(s1.charAt(i) + " --> " + count);
count = 0;
}
}
public static void main(String[] args) {
printDups("AABBCCDDD){}
}
这是输出:
A --> 2
A --> 2
B --> 2
B --> 2
C --> 2
C --> 2
D --> 3
D --> 3
我想打印出来:
A --> 2
B --> 2
C --> 2
D --> 3
我知道我可以添加:if (s1.charAt(i) != s1.charAt(i+1)) System.out.println(s1.charAt(i) + " --> " + count);
但后来我会遇到StringIndexOutOfBoundsException:
如果我将循环更改为此for (int i = 0; i < s1.length()-1; i++)
它会跳过字符串中的最后一个字符。
我怎样才能做到这一点?
答案 0 :(得分:1)
请检查此功能,我在其中添加了两行
public static void printDups(String s1) {
int count = 0;
for (int i = 0; i < s1.length(); i++) {
for (int j = 0; j < s1.length(); j++) {
if (s1.charAt(i) == s1.charAt(j)) {
count++;
}
}
System.out.println(s1.charAt(i) + " --> " + count);
s1 = s1.replaceAll(s1.charAt(i) + "", "");
i--;
count = 0;
}
}
现有的功能
int *p=NULL;
int func (int **point);
int main() {
int num = 5647;
p = malloc(sizeof(int)*2);
p[0] = num;
p[1]= 657;
printf("%d\n", p[0]);
printf("%d\n", p[1]);
func(&p);
printf("%d\n", p[0]);
printf("%d\n", p[1]);
printf("%d\n", p[2]);
printf("%d\n", p[3]);
return 0;
}
int func (int **point){
*point = realloc(*point,sizeof(int)*4);
if (*point==NULL){
printf("\n abort \n");
exit(0);
}
*point[0] = 867;
*point[1]= 777;
*point[2] = 67;
*point[3]= 77;
}
答案 1 :(得分:0)
我知道我可以添加:if(s1.charAt(i)!= s1.charAt(i + 1))System.out.println(s1.charAt(i)+“ - &gt;”+ count );但是我会有StringIndexOutOfBoundsException:
你可以做的是为它添加另一个条件,使它不会越界。
if ( s1.length() < (i+1) && s1.charAt(i) != s1.charAt(i+1))
答案 2 :(得分:0)
如果此组已经包含要打印的字符,那么如何将每个打印字符添加到Set并在每次打印之前进行检查。
public static String eliminateDups(final String s1) {
final Set<Character> set = new HashSet<>();
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < s1.length(); i++) {
final char c = s1.charAt(i);
if (set.contains(c)) {
// skip
} else {
sb.append(c);
}
set.add(c);
}
return sb.toString();
}
答案 3 :(得分:0)
由于您不想使用HashMap或set,因此在计数之前对字符串进行排序是一个不错的选择。此外,您使用的是嵌套循环遍历字符串两次,因此您的时间复杂度为 O(N ^ 2),其中N是字符串的长度。在首先对字符串进行排序然后遍历它时,会将时间复杂度降低到 O(NlogN)。
请注意,使用HashMap会使时间复杂度 O(N)。
import java.util.Arrays;
public class PrintDuplicates
{
public static void printDups(String str){
char[] chars = str.toCharArray();
Arrays.sort(chars);
String sorted = new String(chars);
//to handle the edge case that the String is of 0 length
if(sorted.length() == 0){
return;
}
int count=1;
int i;
for(i=0; i< sorted.length()-1; i++){
if(sorted.charAt(i) != sorted.charAt(i+1)){
System.out.println(sorted.charAt(i)+"-->"+count);
count = 1;
}
else{
count++;
}
}
System.out.println(sorted.charAt(i)+"-->"+count); //to print the last character and it's count last seen
}
public static void main(String[] args){
// printDups("");
// printDups("A");
//printDups("ABA");
printDups("ABCCAAADAA");
}
}