#javascript
#javascript
Вопрос:
// Write a program to check whether or not two arrays are identical in size, and hold identical values
string1 = prompt("String 1?");
string2 = prompt("String 2?");
compareNum = 0;
for(i=0; i<string1.length; i )
{
for(j=i; j<string2.length; j )
{
if (string1.charAt(i) == string2.charAt(j))
{
compareNum ;
break;
}
}
};
alert("We found " compareNum " identical value(s).");
Мне удалось создать относительно простую программу сравнения строк, но теперь проблема, с которой я столкнулся, заключается в результате, который она выдает.
Например, если я ввожу «Jeansy» и «Jeansy» — я получаю ответ «Мы нашли 6 идентичных значений».
В то время как, если я набираю «Molanza» и «Molanza» — я получаю ответ «Мы нашли 9 идентичных значений».
Конечно, это должно быть только 7?
Или ‘a’ учитывается дважды? Могу ли я в любом случае отрицать это?
Кстати, я учитываю все строки.
Заранее спасибо!
Ответ №1:
Ну, вы сравниваете каждую букву в string1 с каждой буквой в string2. Если есть повторяющиеся буквы, вы получите повторяющиеся результаты.
Попробуйте это:
string1 = prompt("String 1?");
string2 = prompt("String 2?");
compareNum = 0; // why are you using the Number contructor? Unneeded.
l = Math.min(string1.length, string2.length);
for( i=0; i<l; i ) {
if( string1.charAt(i) == string2.charAt(i)) compareNum ;
}
// do something with compareNum.
Комментарии:
1. Начните с начала строк, сравните символ 0 с символом 0, char1 с char1 и так далее, продвигаясь по одному символу за раз через обе строки. Гарантирует
Math.min
, что вы не пройдете дальше конца ни одной строки.l
Предварительное вычисление просто делаетfor
оператор более аккуратным, я не знаю, влияет ли это на производительность.2. Я сказал string1? Я сказал char1. Как в «символ в позиции 1».
3. 1 за то, что помните, что строки могут иметь разную длину.
4. Это правильно. J-M, e-o, a-l, n-a, s-n, y-z = совпадений нет. Или вы искали «любую позицию, просто избегайте дубликатов»? Если это так, используйте свой старый код, но используйте второй цикл as
for(j=i; j<...)
, чтобы не сравнивать то, что вы уже сравнивали.5. Хорошо, попробуйте добавить
break
послеcompareNum
(не забудьте добавить фигурные скобки вокруг двух, чтобы цикл влиял на оба оператора).
Ответ №2:
Вы перебираете каждый символ в строке 1 и сравниваете его с каждым символом в строке 2 — но вы перебираете строку 2 для каждого символа в строке 1.
Индексы для каждой строки должны быть одинаковыми; вам не нужны два цикла.
То, как вы обрабатываете строки разной длины, зависит от ваших требований.
Комментарии:
1. Привет, спасибо за помощь — я использовал два цикла, надеясь сравнить все буквы в строках независимо от длины.
2. Но это не то, что вы хотите сделать. Как обрабатывать строки разной длины, зависит от того, что вы хотите сделать, но вам, вероятно, следует просто прекратить сравнение, как только вы превысили длину одного из них. Или определите «сравнить» более точно.
3. Да, вы правы. Под сравнением я подразумеваю, сколько вхождений одной буквы встречается в обеих строках. Например: «Jupiter» и «Mars» имеют 1 вхождение одной и той же буквы, тогда как «Dave» и «Saved» имеют 4 разных вхождения одной и той же буквы. В будущем, как только я получу достаточно хорошее представление, я хочу расширить его, чтобы указать букву и количество вхождений в обеих строках, которые она имеет.
4. О; возможно, вам лучше использовать карту (или индекс массива по символам, по сути, то же самое), поскольку в конечном итоге вы все равно получите что-то подобное. Это определенно меняет постановку задачи и решение; вам действительно нужна какая-то карта.
5. @jeansymolanza Из чего, карты? (Или эквивалент JS, во всяком случае.) Вы можете просто сказать
var m = {};
, что тогда, когда вы сталкиваетесь с символами,m[c] = 1
. Сделайте это для первой строки. Затем перейдите ко второй строке, если для символа уже есть запись, увеличьте счетчик. Если записи еще нет, это не имеет значения, потому что вы просто ищете дубликаты. В конце концов, записи в map с count> 1 являются символами в обеих строках. (Может быть, это немного не в моей голове :/