Как я могу найти отчетливый повторяющийся символ в строке с помощью Java.
Для строки 4567895443577
Здесь первый отчетливый повторяющийся символ — 5
.
Ip:n:1 output:4
n=2 op=5
n=3 op=7
n=4 op=doest exist
Как я могу найти отчетливый повторяющийся символ в строке с помощью Java.
Для строки 4567895443577
Здесь первый отчетливый повторяющийся символ — 5
.
Ip:n:1 output:4
n=2 op=5
n=3 op=7
n=4 op=doest exist
Это можно сделать с помощью следующего кода.
Я использовал ключи 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." );
}
создайте HashSet
и HashMap
: set,map и 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
}
Это должно работать:
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
}
put i<s.length()
в качестве стоп-условия. в цикле не полагайтесь на оптимизацию компилятора, возможно, потребуется выполнить итерацию всей коллекции/строки, чтобы найти length() [при условии, что мы не знаем, как реализуется length()] 27.07.2011 n=2
должен быть 4
27.07.2011 Вы должны создать HashSet
, который реализует Set
Интерфейс.
Коллекция, не содержащая повторяющихся элементов. Более формально, наборы не содержат пары элементов e1 и e2, таких что e1.equals(e2), и не более одного нулевого элемента. Как следует из названия, этот интерфейс моделирует математическую абстракцию множеств.