Проблемы манипулирования строками в Java - PullRequest
3 голосов
/ 28 марта 2011

У меня есть 2 проблемы, которые были заданы вчера в интервью,

Примеры приведены ниже ::
имя функции public String pairStar(String str)

 pairStar("hello") → "hel*lo"     
 pairStar("xxyy") → "x*xy*y"          
 pairStar("aaaa") → "a*a*a*a"

2> Для данной строки вычислите новую строку, в которой все строчные буквы 'x' имеютбыл перемещен в конец строки.

Примеры приведены ниже:
имя функции public String endX(String str)

endX("xxre") → "rexx"     
endX("xxhixx") → "hixxxx"     
endX("xhixhix") → "hihixxx"

Я не уверен, как решить данный набор проблем, и изо всех сил пытаюсь решить эту проблему

Ответы [ 10 ]

8 голосов
/ 28 марта 2011

Для 1), вот очень простой способ регулярного выражения:

  String in = "helllo goodbye";
  String out = in.replaceAll("(.)(?=\\1)", "$1*");
  System.out.println(out);

Отпечатки:

hel*l*lo go*odbye

Объяснение:

(.)     //match any one character into group 1
(?=\\1) //positive lookahead for that same character by backreferencing group 1

$1*     //replace that one character with the character followed by *

Я мог бы взять трещинуна 2) позже, но мне не нравятся несколько вопросов, заключенных в один.

Редактировать

Хорошо, так как я в настроении регулярного выражения, вот 2):

  String in = "xhixhix";
  String out = in;
  while (!out.matches("[^x]*x*")) {
     out = out.replaceAll("x(.*)", "$1x");
  }
  System.out.println(out);

Это заменяет x(something) на (something)x, пока все x не будут в конце строки.Я уверен, что есть лучший способ сделать это с / чем регулярное выражение.

8 голосов
/ 28 марта 2011

В первом случае вы можете перебирать строку, отслеживая предыдущий символ и сравнивая его с текущим.Используйте StringBuilder для создания новой строки.

Во второй итерации, используя два строителя строк (один для символов, отличных от x, один для x), объедините их в конце.

Это всего лишь 30 секунд, и это самый простой подход.Вторая мысль состоит в том, что я, вероятно, буду использовать регулярное выражение, теперь, когда я думаю об этом еще 10 секунд:)

2 голосов
/ 28 марта 2011

для второго:

Циклически перебирайте строку, копируя все нестрочные буквы x в новую строку, сохраняя при этом количество x. В конце просто добавьте соответствующее количество х, чтобы получить окончательную строку.

public String endX(String str)
{
    StringBuilder s = new StringBuilder();
    int x = 0;

    for (int i = 0; i < str.length(); ++i)
    {
        if (str.charAt(i) == 'x')
        {
            ++x;
        }
        else
        {
            s.append(str.charAt(i));
        }
    }

    for (int i = 0; i < x; ++i)
    {
        s.append('x');
    }

    return s.toString();
}
2 голосов
/ 28 марта 2011

Может быть, я неправильно понял вопрос, но если нет, то кажется довольно простым. Ваш метод может быть что-то вроде для номера 1:

public String pairStar(String s) {
    StringBuilder answer = new StringBuilder();
    char lastChar = s.charAt(0);
    answer.append(lastChar);

    for (int i = 1; i < s.length(); i++) {
        char currentChar = s.charAt(i);

        if (currentChar == lastChar) {
             answer.append("*");
        }
        answer.append(currentChar);
        lastChar = currentChar;
    }
    return answer.toString();
}
1 голос
/ 29 марта 2011

для вашей первой проблемы

public String pairStar(String str){
        StringBuilder sb = new StringBuilder(str);
        for (int i = 0; i < sb.length()-1; i++) {
            if(sb.charAt(i)==sb.charAt(i+1)){
                sb.insert(++i, '*');
            }
        }
        return sb.toString();
    }

и для вашей второй проблемы

public String endX(String str){
        StringBuilder sb = new StringBuilder(str);
        int length = sb.length()-1;
        for (int i = 0; i < length; i++) {
            if(sb.charAt(i)=='x'){
                sb.deleteCharAt(i--);
                sb.append('x');
                length--;
            }
        }
        return sb.toString();
    }
1 голос
/ 28 марта 2011

для первой задачи:

public class StreamGobbler {

    public static void main(String[] a) {

        String s = "xxyy";

        StringBuffer sb = new StringBuffer(s);

        for(int i=0; i < sb.length()-1; i++) {
            if(sb.charAt(i) == sb.charAt(i+1)) {
                sb.insert(i+1, "*");
                i++;
            }
        }

        System.out.println(sb.toString());
    }
}

отпечатки: x * xy * y

1 голос
/ 28 марта 2011

Я обычно начинаю подобные проблемы с psuedo-кодом, затем перехожу к реальной реализации.

Для проблемы 1, вот как работает код псевдо в моей голове

for each character in the input string{
 if the previous character is the same{
  append a star to output string
 }
 append the character to the output string
}

Для проблемы 2

for each character in the input string{
  if character is an x{
   increment x counter
  } else {
   append the character to the output string
  }
}
x counter times{
  append x to the output string
}
1 голос
/ 28 марта 2011

для 1 вам нужен конечный автомат с двумя состояниями: (а) отличается от предыдущего и (б) такой же, как предыдущий.начальное состояние (а).для каждой буквы вы должны проверить, в каком вы состоянии, вывести символ и соответственно изменить состояние.для каждой буквы, прочитанной в состоянии (b), вы также выводите '*'.

для 2, вам нужен массив, в котором вы можете перемещать элементы влево и нажимать в конце.1. нажмите маркер монитора в конце (полезно для остановки) 2. переберите все буквы: при нахождении «x» сдвиньте все элементы влево, нажмите x в конце и посчитайте суммуиз х вы видели.3. остановиться при просмотре жетона монитора

0 голосов
/ 16 декабря 2016

шаг 1. Скажите им, чтобы он запихнул его, а затем вместо него использовал python!

шаг 2.:

>>> strin = 'thixs ixs xan XArbitrarxy Stxrxing'
>>> xcnt = strin.count('x')
>>> result = ''.join(i for i in strin if i != 'x')
>>> result = result + ('x' * xcnt)
>>> print result
this is an XArbitrary Stringxxxxxx
0 голосов
/ 26 мая 2014
public class IdenticalChars {

    /**
     * separates any two same n adjacent characters of any string
     * by a * 
     */
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder();
        String s="aaabcgghelllloii";
        for(int i=0;i+1<s.length();i++){
            if((s.charAt(i)!=s.charAt(i+1)&&(i==0))){
                sb.append(s.charAt(i)+" "+s.charAt(i+1));
                //System.out.println(sb.toString());
            }
            else if((s.charAt(i)!=s.charAt(i+1)&&(i>0))){
                sb.append(s.charAt(i+1));
            }
            else if((s.charAt(i)==s.charAt(i+1))&&(i>0)){
                sb.append("*"+s.charAt(i+1));

            }
            else if((s.charAt(i)==s.charAt(i+1))&&(i==0)){
                sb.append(s.charAt(i)+"*"+s.charAt(i+1));
                }
        }

        System.out.println(sb.toString());
    }

}

Выход :: а * а * abcg * ghel * л * л * LOI * я

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