найти повторяющийся символ в строке - PullRequest
0 голосов
/ 27 июля 2011

Как найти отличительный повторяющийся символ в строке, используя Java.

Для строки 4567895443577

Здесь первый различимый повторяющийся символ 5

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

Ответы [ 5 ]

2 голосов
/ 27 июля 2011

Это должно работать:

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 голосов
/ 27 июля 2011

создать HashSet и HashMap: установить, отобразить и int count = 0, выполнить итерацию по строке и добавить каждый символ и его индекс.в конце - значение каждого символа будет последним индексом.
повторите итерацию над строкой и проверьте, соответствует ли индекс указанному на карте.если это так (или персонаж появляется в наборе) - игнорируйте его.
если персонажа нет в наборе, а индексы как есть и как на карте не совпадают - увеличить количество (пока не достигнет 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

}
0 голосов
/ 09 января 2018
 /* 
 * 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;
 }
}
0 голосов
/ 27 июля 2011

Это можно сделать с помощью следующего кода.

Я использовал ключи 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." );
}
0 голосов
/ 27 июля 2011

Вы должны создать HashSet, который реализует интерфейс Set.

Коллекция, содержащая без повторяющихся элементов . Более формально устанавливает не содержат пары элементов e1 и e2, для которых e1.equals (e2) и самый один нулевой элемент. Как следует из названия, этот интерфейс модели математический набор абстракции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...