计算用户给出的String中的唯一字符

时间:2014-03-23 21:45:48

标签: java

我必须编写一个程序来计算用户给出的字符串中的唯一字符。例如,“abc”返回3,“aabbccd”返回4.我不允许使用高级Java类,如Map,Set等。我只能使用数组,字符串,for循环,while循环,if语句。我正在尝试使用嵌套循环,但我对如何为第二个for循环编写算法感到困惑。

public static int countUniqueCharacters(String input){

String orgInput = input.toLowerCase();
        int count = 0;
        int stringLength = input.length();
        for( int i = 0; i<stringLength; i++){
            for(int j = 2; j > j-i-1; j--){
                char temp = orgInput.charAt(i);
                if (temp == orgInput.charAt(j)){
                    count++;

12 个答案:

答案 0 :(得分:36)

使用Java 8,您可以执行以下操作:

public static long countUniqueCharacters(String input) {
    return input.chars()
            .distinct()
            .count();
}

这会创建IntStream char个,然后只接受区分值,然后计算出现次数。

答案 1 :(得分:5)

非常容易:)

public static int countUniqueCharacters(String input) {
    boolean[] isItThere = new boolean[Character.MAX_VALUE];
    for (int i = 0; i < input.length(); i++) {
        isItThere[input.charAt(i)] = true;
    }

    int count = 0;
    for (int i = 0; i < isItThere.length; i++) {
        if (isItThere[i] == true){
            count++;
        }
    }

    return count;
}

输入“aab”的示例

第一个for-cycle进行3次,每次进行一次char。

“a”的值是97,所以它将isItThere [97]变为true,然后涉及第二个“a”,这也是相同的,isItThere [97]再次设置为true(因此不做任何改变)。

在涉及“b”之后,char“b”的值为98,因此isItThere [98]设置为true。

然后你有第二个for-cycle,你循环遍历所有isItThere数组。如果您发现任何真实陈述,则增加计数。在我们的例子中,你发现isItThere [97]和isItThere [98]作为真实陈述,它意味着你增加两次并返回2.

答案 2 :(得分:4)

这是另一种解决方案:

public static int countUniqueCharacters(String input) {
    String buffer = "";
    for (int i = 0; i < input.length(); i++) {
        if (!buffer.contains(String.valueOf(input.charAt(i)))) {
            buffer += input.charAt(i);
        }
    }
    return buffer.length();
}

每个字符的第一次出现都存储在buffer中。因此,buffer中包含所有字符,因此buffer.length()会提供您需要的计数。

答案 3 :(得分:4)

如果您坚持使用Java 7,您可以使用ArrayList并只为其添加唯一值,然后返回ArrayList的大小,即使计数为零也应该始终有效。

 import java.util.ArrayList;

 public int getUniqeCount( String arg )
 {
     ArrayList<Character> unique = new ArrayList<Character>();
     for( int i = 0; i < arg.length(); i++)
         if( !unique.contains( arg.charAt( i ) ) )
             unique.add( arg.charAt( i ) );
     return unique.size();
 }

答案 4 :(得分:2)

public static int countUniqueChars (String buf) {
    HashSet<Character> hash = new HashSet<>();
    buf = buf.toUpperCase();
    for (int i = 0; i < buf.length(); i++)
        hash.add(buf.charAt(i));
    return hash.size();
}

答案 5 :(得分:0)

public static long calculateDistinctSubStringSum(String text) {
    Map<String, Integer> map = new HashMap<String, Integer>();
    char[] charAarry = text.toCharArray();
    for (int i = 0; i < charAarry.length; i++) {
        map.put(charAarry[i] + "", 1);
    }
    return map.size();

}

这是我的计算方法,但我仍在寻找任何快速方法。如果有人知道请回答。

答案 6 :(得分:0)

您可以使用HashSet集合来计算字符串中的唯一元素。它只允许使用唯一元素。

代码段

public static int uniqueCount(String str) 
{
   HashSet<Character> al = new HashSet<Character>();
   char[] arr= str.toCharArray();
   for (int i=0; i<arr.length; i++) 
   {
      al.add(arr[i]);  
   }
   return al.size() ;
}  

请参阅此链接以获取完整代码:ideone

答案 7 :(得分:0)

尝试查看以下代码是否可以帮助您:

String myString = "";

for(int i=0; i< word.length(); i++) {

    if(myString.indexOf(word.charAt(i)) == -1) {
        System.out.println(word.charAt(i));
        myString = myString + word.charAt(i);
    }
}
return myString.length();

答案 8 :(得分:0)

 SELECT  userName ,
    ( credit - debit ) AS balanceToPay
FROM    ( SELECT    A.userName ,
                SUM(CASE WHEN B.transactionType = 'credit'
                         THEN B.transactionAmt
                         ELSE 0
                    END) AS Credit ,
                SUM(CASE WHEN B.transactionType = 'debit'
                         THEN B.transactionAmt
                         ELSE 0
                    END) AS debit
      FROM      table1 A
                INNER JOIN table2 B ON A.userid = B.userid
                GROUP BY A.userName
    ) L

答案 9 :(得分:0)

字符串中的唯一字符:

这是一个基本的Java访谈主题,面试官想要检查知识 HashSet或indexOf(在Java 7的情况下)。 我们来回答一个问题。 让我们说面试告诉你 检查String是否唯一: HashSet确保唯一性,换句话说,HashSet中的每个对象只呈现一次。 因此,我们将使用HashSet。

import java.util.HashSet;
import java.util.Set;

public class Abc {
public static void main(String[] args) {
    String a = "Gini";
    String aa = a.toLowerCase();
       if(  isUnique(aa)   ) {
              System.out.println("All characters are unique");
       }else {
           System.out.println("All characters  are not unique");
       }
}
public static boolean isUnique(String a ) {
    Set< Character> set = new HashSet<>();
    char[] charArray =a.toCharArray();
    for(Character ch :charArray) {
        if(!set.add(ch)) {
            return false;
        }//if
    }//foreach
        return true;
}
}

GINI的输出将是:所有字符都不是唯一的

现在,唯一字符的数量。 在这里,我们也将使用HashSet,因为它具有唯一性。

import java.util.HashSet;

public class practice11 {
public static void main(String[] args) {
    String a = "Gini";
    String aa = a.toLowerCase();
    System.out.println(countUniqueCharacters(aa));  
}
public static int  countUniqueCharacters(String a) {
    char[] charArray = a.toCharArray();

    HashSet<Character> set = new HashSet<Character>();

    for(int i = 0 ; i< charArray.length ; i++) {

         set.add(charArray[i]);
    }//for
    return   set.size() ;//This will give 3
}
}

Gini的输出为3(将考虑Gin)。

indexOf方法: indexOf()返回第一次出现的字符的索引,然后我们与-1进行比较。

public class Abc {
public static void main(String[] args) {
    String a = "Gini";
    String aa = a.toLowerCase();
    String t = " ";
    for (int i = 0; i < aa.length(); i++) {
            int  pp =   aa.charAt(i) ;

        if(t.indexOf(aa.charAt(i))  ==  -1  ) {
            t = t + aa.charAt(i);
        }//if


    }//for

    System.out.println(t );// This will give => gin
    System.out.println(t.length()); // this will give 3
}//main
}//end

在Java 8中,这非常简单。我们只需要使用chars()。distinct()。count()。 但返回类型会很长。

class Abc{
    public static void main(String[] args) {
        String a = "Gini";
        String aa = a.toLowerCase();
        System.out.println(  countUnique(aa));
    }

    private static long  countUnique(String aa) {
        // this will give 3(gin. another i will be not be counted as we have used distinct())
         return  aa.chars().distinct().count() ; 
    }
}

另一个经典采访问题:在字符串中查找第一个非重复字符或在字符串中查找第一个唯一字符。使用HashMap的知识可以解决这个问题。

class Abc{
    public static void main(String[] args) {
          String a = "GinaRani" ;
// Output will be G
          System.out.println( firstNonRepeatingCharacter(a) );

    }//main
    public static Character firstNonRepeatingCharacter(String a){
      Map<Character, Integer> map = new HashMap<>();
        char[] charArray = a.toCharArray();
        for(    Character  ch   :     charArray){
               if( map.containsKey(ch)   )   {
                    map.put(ch, map.get(ch) +1 ) ;
               } else{
                   map.put(ch, 1);
               }
        }//for

        // 1st non repeating character

        for( int  i = 0 ; i < a.length(); i ++ ){
             char chh = a.charAt(i);
             if(  map.get(chh) == 1 ){
                 System.out.println("first non repeating character in the String is  : ");
                   return chh ; 
             }//if
        }//for

        return null; 

    }//firstNonRepeatingCharacter
}//end

我们将在Python的list comprehension的帮助下完成这项工作。我们没有使用set()运算符。 在Python中:

string = 'GiniGinaProtijayi'

unique = []

[ unique.append(ch)  for ch in string if ch not in unique ]
lengthofUniqueCharacters = len(unique)
print("length of Unique Characters => " ,lengthofUniqueCharacters)
print("as a list => ",unique)
print("as a string => " , ''.join(unique))

只需在Java 8中打印出不同的字符:

public class Test5 {
    public static void main(String[] args) {
        String a = "GinaGini";

        String aa = a.chars().distinct()
                .collect(StringBuilder::new, 
                        StringBuilder::appendCodePoint, 
                        StringBuilder::append)
                .toString();
        System.out.println(aa);//Gina

    }// main

}

答案 10 :(得分:0)

在允许您使用Java集合的情况下,以下代码可读,紧凑并且可以顺利完成工作

public static int countUniqueChar(String word){
    Set<Character> wordSet = new HashSet<>();
    for(Character c : word.toCharArray())
        wordSet.add(c);
    return wordSet.size();
}

答案 11 :(得分:0)

String myString = "";

for(int i=0; i< word.length(); i++) {
    if(myString.indexOf(word.charAt(i)) == -1) {
        System.out.println(word.charAt(i));
        myString = myString + word.charAt(i);
    }
}
return myString.length();