如何使用Java在字符串中找到不同的重复字符。
对于字符串4567895443577
这里,第一个不同的重复字符是5
Ip:n:1 output:4
n=2 op=5
n=3 op=7
n=4 op=doest exist
答案 0 :(得分:2)
创建HashSet
和HashMap
:设置,地图和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)
包含无重复元素的集合。更正式的,集合 不包含元素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;
}
}