Более простым способом может быть
/(\D+)/.match('1221').nil? #=> true
/(\D+)/.match('1a221').nil? #=> false
/(\D+)/.match('01221').nil? #=> true
function reverseString(string) {
var reversedString = "";
var stringLength = string.length - 1;
for (var i = stringLength; i >= 0; i--) {
reversedString += string[i];
}
return reversedString;
}
String.prototype.reverse_string=function() {return this.split("").reverse().join("");}
или
String.prototype.reverse_string = function() {
var s = "";
var i = this.length;
while (i>0) {
s += this.substring(i-1,i);
i--;
}
return s;
}
Пока вы имеете дело с простыми символами ASCII и с удовольствием используете встроенные функции, это будет работать:
function reverse(s){
return s.split("").reverse().join("");
}
Если вам нужно решение, поддерживающее UTF-16 или другие многобайтовые символы, имейте в виду, что эта функция выдаст недопустимые строки Unicode или допустимые строки, которые выглядят забавно.
Вся суть «перевернуть строку на месте» - это устаревший вопрос для собеседований программистов на C и людей, которые были - спросит опрошенный ими (может, из мести?). К сожалению, часть «на месте» больше не работает, потому что строки практически на любом управляемом языке (JS, C # и т. Д.) Используют неизменяемые строки, тем самым разрушая всю идею перемещения строки без выделения новой памяти.
Хотя приведенные выше решения действительно обращают строку, они не делают этого без выделения дополнительной памяти и, следовательно, не удовлетворяют условиям. У вас должен быть прямой доступ к выделенной строке и возможность манипулировать ее исходной ячейкой памяти, чтобы иметь возможность перевернуть ее на месте.
Лично я ненавижу подобные вопросы на собеседовании, но, к сожалению, я уверен, что мы будем видеть их еще долгие годы.
Никакие встроенные методы? Это - лучший способ:
function ReverseString(str) {
var len = str.length;
var newString = '';
while (len--) {
newString += str[len];
}
return newString;
}
console.log(ReverseString('amgod'))
Другой вариант (работает ли он с IE?):
String.prototype.reverse = function() {
for (i=1,s=""; i<=this.length; s+=this.substr(-i++,1)) {}
return s;
}
РЕДАКТИРОВАТЬ:
Это без использования встроенных функций:
String.prototype.reverse = function() {
for (i=this[-1],s=""; i>=0; s+=this[i--]) {}
return s;
}
Примечание: это [-1] содержит длину строки.
Однако невозможно перевернуть строку на месте, так как присвоение отдельные элементы массива не работают с объектом String (защищен?). Т.е. можно делать присваивания, но результирующая строка не меняется.
Вы можете попробовать что-то вроде этого. Я уверен, что есть место для рефакторинга. Я не мог обойтись без функции разделения. Может быть, кто-то знает способ сделать это без разделения.
Код для настройки, можете поместить его в свою библиотеку .js
Код для его использования (имеет код на стороне клиента, только потому, что он был протестирован в браузере) :
var sentence = "My Stack is Overflowing."
document.write(sentence.reverseLetters() + '<br />');
document.write(sentence.reverseWords() + '<br />');
Фрагмент:
String.prototype.aggregate = function (vals, aggregateFunction) {var temp = ''; for (var i = vals.length - 1; i> = 0; i--) {temp = aggregateFunction (vals [i], temp); } return temp; } String.prototype.reverseLetters = function () {return this.aggregate (this.split (''), function (current, word) {return word + current;})} String.prototype.reverseWords = function () {return this.aggregate (this.split (''), function (current, word) {return word + '' + ток; })} var предложение = "Мой стек переполнен". document.write (предложение.reverseLetters () + '
'); document.write (предложение.reverseWords () + '
');