«количество сегментов в строке» не работает для определенного ввода - PullRequest
2 голосов
/ 03 мая 2020

Я должен найти «непрерывную последовательность непробельных символов» в строке. Мой вывод неверен для ввода

Input=", , , ,        a, eaefa"

Мой ответ идет как 13 вместо 6. Хотя я только посчитал слова, кроме пробелов.

class Solution {
    public int countSegments(String s) 
    {
        if(s.isEmpty()){
            return 0;
        }
        else
        {
            int count=0;
            String s1[]=s.split(" ");
            for(int i=0;i<s1.length;i++)
            {
                if(s1[i]!=" ")
                    count++;
            }
            return count;
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 03 мая 2020

Другие предлагают использовать:

s.split("\\s+").length

Однако есть осложнения при использовании split. В частности, приведенное выше даст неправильные ответы для строк с пробелами. Даже если эти проблемы устранены, это все равно слишком дорого, поскольку мы создаем count новых строк и массив для их хранения.

Мы можем реализовать countSegments напрямую, выполняя итерацию по строке и подсчитывая количество раз, которое мы go переходим от непробельного символа к пробелу или концу строки:

public static int countSegments(String s)
{
    int count = 0;
    for(int i=1; i<=s.length(); i++)
    {
        if((s.charAt(i-1) != ' ') && (i == s.length() || s.charAt(i) == ' ')) count++;
    }
    return count;
}

Тест:

for(String s : new String[] {"", " ", "a", " a", "a ", " a ", ", , , ,        a, eaefa"})
    System.out.format("<%s> : %d%n", s, countSegments(s));

Выход:

<> : 0
< > : 0
<a> : 1
< a> : 1
<a > : 1
< a > : 1
<, , , ,        a, eaefa> : 6
1 голос
/ 03 мая 2020

«количество сегментов в строке» не работает для определенного ввода

Это можно легко сделать с помощью регулярного выражения \\s+ следующим образом :

public class Main {
    public static void main(String[] args) {
        String str = ", , , ,        a, eaefa";
        str = str.trim();// Remove the leading and trailing space
        System.out.println(str.isEmpty() ? 0 : str.split("\\s+").length);
    }
}

Вывод:

6

Регулярное выражение \\s+ соответствует одному или нескольким последовательным пробелам.

На стороне обратите внимание, вы используете != для сравнения строк, что не правильно. Обратите внимание, что == и != используются для сравнения ссылок, а не значений.

1 голос
/ 03 мая 2020

Вы должны использовать разделение на несколько пробелов, и тогда у вас уже есть сегменты, разделенные для вас, поэтому вам не нужно делать for-l oop или что-либо еще.

//The trim is because split gets messed up with leading spaces, as SirRaffleBuffle said
s = s.trim();
if (s.isEmpty()) return 0;
return s.split("\\s+").length;
  • Если вам нужны только последовательности alphanumeri c символов, вы можете использовать вместо этого следующее регулярное выражение: "\\W+"
  • Если вы хотите только последовательности букв Engli sh, вы может сделать то же самое, но с регулярным выражением "[^A-Za-z]+".

Здесь оно разделяется на несколько пробелов вместо одного.

То, как вы это делаете в настоящее время, вы посчитайте каждую букву, которая не является пробелом, вместо "непрерывных последовательностей символов без пробелов". Вот почему вы получаете 13 вместо 6.

Обратите внимание, что счет увеличивается каждый раз, когда он находит что-то, что не является пробелом, но если вы хотите сделать это с for-l oop, у вас должен быть логический флаг, указывающий, что вы ввели последовательность, поэтому вы увеличиваете счетчик только тогда, когда эта квартира была ранее ложной (вы были вне последовательности), а затем вы находите пробел.

Также, используя != для сравнения строк неверно, вы должны использовать метод equals.

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