仅打印每个字符和数字一次

时间:2017-07-09 05:48:45

标签: java string

我想在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++)

它会跳过字符串中的最后一个字符。

我怎样才能做到这一点?

4 个答案:

答案 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");
   }
}