在字符串中查找重复的字符

时间:2011-07-27 07:40:01

标签: java string

如何使用Java在字符串中找到不同的重复字符。

对于字符串4567895443577

这里,第一个不同的重复字符是5

Ip:n:1 output:4
   n=2     op=5
   n=3     op=7
   n=4     op=doest exist

5 个答案:

答案 0 :(得分:2)

创建HashSetHashMap:设置,地图和int count = 0, 迭代字符串,并添加每个字符及其索引。最后 - 每个字符的值将是最后一个索引。 再次遍历String,并检查索引是否与地图中显示的一样。如果它(或字符出现在集合中) - 忽略它。
如果一个字符不在集合中,并且索引原样和地图中的字符不匹配 - 增加计数(直到达到n)。

复杂性:O(n)

public static Character findN(String str,int n) { 
    HashMap<Character, Integer> map = new HashMap<Character, Integer>();
    int len = str.length();
    for (int i=0;i<len;i++) { 
        map.put(str.charAt(i),i);
    }
    int count=0;
    HashSet<Character> set = new HashSet<Character>();
    for (int i=0;i<len;i++) {
        if (set.contains(str.charAt(i))) continue;
        if (map.get(str.charAt(i)) != i) {
            count++;
            if (count == n) return str.charAt(i);
            set.add(str.charAt(i));
        }
    }
    return null; //it does not exist

}

答案 1 :(得分:2)

这应该有效:

public static char findChar(String s, int length) {
int[] counts = new int[10];

// iterate over the letters and increment the count
int stringLength = s.length();
for(int i = 0; i < stringLength; i++ ) {
    char c = s.charAt(i);
    int value = Character.getNumericValue(c);
    counts[value]++;
}

int counter = 0; // how many chars repeated so far
for(int i = 0; i < stringLength; i++ ) {
    char c = s.charAt(i);
    int value = Character.getNumericValue(c);
    if(counts[value] >= 2) {

    counts[value] = -1; // do not count this twice
    counter++;

    if(counter == length) {
        return c;
    }
    }
}
return '\u0000'; // null char
}

答案 2 :(得分:0)

您应该创建一个HashSet来实现Set接口。

  

包含无重复元素的集合。更正式的,集合   不包含元素e1和e2对,使得e1.equals(e2)和at   大多数一个null元素。正如其名称所暗示的,这个界面模型   数学集抽象。

答案 3 :(得分:0)

这可以通过以下代码完成。

我使用HashMap键作为输入字符,使用值作为计数器。

String str = "4567895443577";
char[] chars = str.toCharArray();
HashMap<Character, Integer> charMap = new HashMap<Character, Integer>();
for( char c : chars )
{
    if( charMap.containsKey( c ) ){
        charMap.put(c, charMap.get(c) + 1 );
    }else{
        charMap.put(c, 1);
    }
}
for( Entry<Character, Integer> entry : charMap.entrySet() )
{
    System.out.println( "Character '"+entry.getKey()+"' is repeated for '"+entry.getValue()+"' times." );
}

答案 4 :(得分:0)

 /* 
 * Ex-OR basic : 0^0 = 0, 0^1 = 1, 1^0 = 1, 1^1 = 0  
 * 
  Ex-ORing bits of all characters in String nums = "4567895443577"
  i   Operation                Bitwise operation    Result(bin)   Result(Dec)  
  0       4 ^ 5 ...arr[0]^arr[1]       100 ^ 101            001             1                 
  //NOTE : first occurence as result = 1 should be skipped
  ----------------------------------------------------------------------------      
       Result(i-1)        arr[i]
  for:  
  1       1        ^        5          001 ^ 101            100             4
  2       4        ^        6          100 ^ 110            010             2
  3       2        ^        7          010 ^ 111            101             5
  4       5        ^        8          0101 ^ 1000         1101            13
  5      13        ^        9          1101 ^ 1001         0100             4
  6       5        ^        4          0101 ^ 0100         0001             1                  
 // break "for" found repeated element. return 5           
 * */
public class RepeatedNumber {
 public static void main(String args[]) {
    String nums = "4567895443577";
    char  repeated = (char) findRepeated(nums.toCharArray()) ;
    System.out.println("result ="+repeated);
 }
 public static int findRepeated(char arr[]) {

    int result = arr[0]^arr[1];
    int repeated = arr[0];
    //find out number repeated more than once in array
    if(result != 0) {
        for(int i = 1; i < arr.length; i++) {

            result = result ^ arr[i];

            if(result == 1 || arr[i] == arr[i-1]) {

                repeated = arr[i];
                break;
            }
        }
    }
    return repeated;
 }
}