Ошибка сервера в приложении ‘/’.
Описание: На сервере возникла ошибка приложения. Текущая пользовательская настройка ошибок для этого приложения не позволяет удаленно просматривать сведения об ошибке данного приложения (из соображений безопасности). Однако, сведения можно просматривать в браузерах, запущенных на локальном сервере.
Сведения: Для разрешения просмотра сведений данного сообщения об ошибке на локальном сервере создайте тег в файле конфигурации «web.config», который находится в корневом каталоге текущего веб-приложения. В теге следует задать атрибут «mode» со значением «Off».
Примечания: Отображаемую в данный момент страницу ошибок можно заменить на пользовательскую страницу ошибок, изменив атрибут «defaultRedirect» тега конфигурации приложения таким образом, чтобы он содержал URL-адрес пользовательской страницы ошибок.
Нахождение самого длинного слова в тексте, недочеты алгоритма — Java
Здравствуйте, столкнулся с небольшой проблемой, задача — написать программу, которая ищет самое длинное слово в тексте, вводимого построчно, причем слова могут быть разделены любыми символами, кроме «_». Сама программа удалась, но с большими объемами текста за нужное время не справляется. Прошу помощи с ее оптимизацией или изменения алгоритма работы. Цель — проанализировать текст содержащий до 500 000 символов менее чем за секунду.
import java.util.Scanner; public class Start < public static void main(String [] args) < Scanner in = new Scanner(System.in); String str = "",max = ""; while (in.hasNextLine())< str += " " + in.nextLine(); >String[] strL = new String[90000]; //массив слов for (int i = 0; i for (int i=0,k=0;i 47 && chr < 58) || (chr >64 && chr < 91 ) || (chr >96 && chr < 123) || (chr == 95))< strL[k] = strL[k]+str.charAt(i); // проверяю, находится ли символ, разделяющий слова, если нет, прибавляю символ к слову, иначе, перехожу к следующему >else > for (String aStrL : strL) < //нахожу наибольшее слово if (aStrL.length() >max.length()) < max = aStrL; >> System.out.println(max); > >
P.S. Первый раз пишу на Stack Overflow, заранее извиняюсь за ошибки и недочеты)
Отслеживать
задан 15 фев 2017 в 10:01
Кирилл Пешков Кирилл Пешков
3 1 1 серебряный знак 6 6 бронзовых знаков
Необходимо ли забивать strL пустыми строками? Лучше использовать не String , а StringBuilder или StringBuffer . В последнем переборе можно бежать не по всему массиву, а до заранее известного числа вставленных слов. Имхо сортировка, как предложили в ответе, применительно к задаче с такими требованиями — зло
15 фев 2017 в 10:47
Вообще не надо заносить слова ни в какой массив. Анализируете посимвольно строку, определяете вы в слове или между ними. Как только определили, что внутри слова, начинаете считать его длину. Как только поняли, что начался промежуток, корректируете текущий максимум.
15 фев 2017 в 11:07
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Я бы сделал вот так:
Scanner scanner = new Scanner(System.in); String wordWithMaxLength = ""; while (scanner.hasNextLine()) < String[] words = scanner.nextLine().split("(_|\\s)+"); Arrays.sort(words, Comparator.comparing(String::length, Comparator.reverseOrder())); wordWithMaxLength = words[0].length() >wordWithMaxLength.length() ? words[0] : wordWithMaxLength; > System.out.println(wordWithMaxLength);
Если версия java < 8:
Arrays.sort(words, new Comparator() < @Override public int compare(String o1, String o2) < return Integer.compare(o2.length(), o1.length()); >>);
Отслеживать
ответ дан 15 фев 2017 в 10:16
15k 1 1 золотой знак 22 22 серебряных знака 40 40 бронзовых знаков
Компилятор ругается на строку Arrays.sort(words, Comparator.comparing(String::length, Comparator.reverseOrder()));
15 фев 2017 в 10:30
@КириллПешков java 8 нужна
15 фев 2017 в 10:38
А вот с этим проблема. У меня-то java 8ая, а вот на сервере — нет. Есть еще какие-нибудь варианты?
15 фев 2017 в 10:44
Теперь быстро, но не правильно) Ввод: 678+23467.89+87909-234_L/43 // Error Вывод: 678+23467.89+87909-23 Ввод: Voronezh State University is one of the main universities in Central Russia. Вывод: universitie и т.п. То есть он проглатывает последнюю букву иногда + игнорирует некоторые символы(
15 фев 2017 в 11:22
Я не знаю по каким символам происходит разбиение на слова. В моем ответе основная идея заключается в том, что строку делим на слова. Разбиение происходит на основе регулярного выражения — (_|\\s)+ — нижнее подчеркивание либо символ пробела. задайте указанные символы в регулярке и все будет работать.
15 фев 2017 в 11:27
Вариант такой ( но могут быть косяки с граничными условиями и предполагается что слово не может быть разорвано переносом строки, нужно проверять на реальных данных ):
Scanner in = new Scanner(System.in); String line, max = ""; int start = 0; while (in.hasNextLine()) < line = in.nextLine(); for (int i=0; i47 && chr < 58) || (chr >64 && chr < 91 ) || (chr >96 && chr < 123) || (chr == 95))< >else < if ( i - start >max.length() ) < max = line.substring( start, i ); >start = i+1; > > start = 0; > System.out.println(max);
Отслеживать
ответ дан 15 фев 2017 в 11:26
2,191 2 2 золотых знака 13 13 серебряных знаков 26 26 бронзовых знаков
Благодарю, я понял смысл, но тесты все-равно какие-то чудеса творят. При вводе только чисел или только подчеркиваний — на выводе пусто. Даже не знаю как это понимать. Возможно из-за того, что кроме нужных символов, в вводе ничего нет, то есть else ни разу не выполняется, но это предположение. P.S. Переносов слова через строку — нет.
15 фев 2017 в 11:44
Как можно поставить проверку на то, кончилась строка или нет? А то если имеем на ввод: 1 22 333 4444 55555, то на выводе будет 4444 и т.п.
15 фев 2017 в 11:52
Я начал добавлять не читаемый символ в конец каждой строки и все заработало, огромное спасибо)
15 фев 2017 в 12:08
@КириллПешков Как раз граничные условия — не всё предусмотрел, извиняюсь) А так — всегда пожалуйста
15 фев 2017 в 12:58
На всякий случай альтернативный вариант решения. Умеет корректно работать с русскими буквами. Если словом является набор цифр, то вместо Character.isLetter() надо использовать Character.isLetterOrDigit() На моей машине сработал быстрее, чем предолженный в ответе. Также, если нет необходимости, можно убрать обработку переноса строки.
String getLongestWord(String s) < //Символ подчеркивания и переноса строки final char underLine = '_'; final char nextLine = '\n'; //Результирующая строка String result = ""; //Счетчик кол-ва символов переноса int nextLines = 0; //Флаг наличия данного символа у результирующего слова boolean resultHasNextLines = false; //Массив символов, в котором ведем поиск char[] searchArray = s.toCharArray(); //Значение индекса начала текущего слова int wordStartIndex = 0; //Флаг нахождения в слове boolean inWord = true; //Проходим по всем строкам for (int i=0;i> else/Иначе если какой-либо другой символ //Если до этого были в слове if (inWord) < //Получаем длину слова. При этом игнорируем символы перехода на след линию final int len = nextLines> 0 ? i - wordStartIndex - nextLines : i - wordStartIndex; //Если эта длина больше чем предыдущая максимальная if (len > result.length()) < //Обновляем результирующую строку result = s.substring(wordStartIndex, i); //Устанавливем триггер символа новой строки для результирующего слова resultHasNextLines = nextLines>0; > else nextLines = 0;//Иначе не забываем сбросить счетчик символов новой строки inWord = false; > > > //Если были символы новой строки убираем их из результата. if (resultHasNextLines) result = result.replaceAll(String.valueOf(nextLine),""); return result; >
Как найти самое длинное слово в строке java
Регистрация: 19.09.2010
Сообщений: 15
Скрипт-нахождения длинного слова(Перенесено из Java SE)
Как найти самое длинное слово в строке и вывести его в alert?
Жду ответа очень нужно..в инете нету времени искать
вот мой скрипт который делает разбиение строк-каждую четную строку выводит большими буквами и вот осталось найти самое длинное слово и высети его отдельно в Alert.
Самое длинное слово в тексте
Дана строка, содержащая пробелы. Найдите в ней самое длинное слово, выведите это слово и его длину. Если таких слов несколько, выведите первое из них.
входные данные
one two three four five six
выходные данные
three
5
Понимаю как выводить самое длинное слово из текста, но не знаю как еще находить его длину, пробовал проверять каждое слово и сравнивать с другим, помогите, пожалуйста
Голосование за лучший ответ
функция len() возвращает длину аргумента-строки
Асет НукубаевУченик (72) 4 года назад
он будет выводить кол-во символов во всем предложении же
Алексей Кандрин Мудрец (16307) а как ты выводишь самое длинное слово?
Предлагаю простое детское решение. Принимаешь самым длинным первое слово, потом перебирая в цикле находишь и слово и его длину
a=’one two three four five six’
s=a.split()
mxs=(s[0])
for i in range(1,len(s)):
if len(s[i])>len(mxs):mxs=s[i]
print(mxs,len(mxs))
ls = input(‘Введите текст: ‘).split(‘ ‘)
max_len = max([len(x) for x in ls])
print([x for x in ls if len(x) == max_len])
Дмитрий ГригорьевГуру (2809) 1 год назад
word = sorted(text.split(), key=len)[-1]
print(word, len(word))
text = input(‘Введите строку: ‘).split()
clone = [len(i) for i in text]
biggest = text[clone.index(max(clone))]
print(‘Самое длинное слово: <>‘.format(biggest))
print(‘Длина этого слова: <>‘.format(len(biggest)))
string = input(‘Введите строку: ‘).split()
len_list = [len(i_str) for i_str in string]
print(‘Самое длинное слово:’, string[len_list.index(max(len_list))])
print(‘Длина этого слова:’, max(len_list))
#include
#include
using namespace std;
int main() <
string str;
int i = 0, j = 0, m = 0, n = 0;
getline(cin, str);
while(i <
j++;
if(str[i] == ‘ ‘ || i == str.size())
<
if(n < j - 1)
<
n = j — 1;
m = i — n;
>
j = 0;
>
i++;
>