जब आप अंतर्निहित फ़ंक्शन ( .reverse()
, .charAt()
आदि) का उपयोग किए बिना, एक फ़ंक्शन में पास (या-इन-प्लेस) को स्ट्रिंग में रिवर्स करते हैं, तो यह एक रिटर्न स्टेटमेंट के साथ एक फ़ंक्शन में जाता है ।
जब आप अंतर्निहित फ़ंक्शन ( .reverse()
, .charAt()
आदि) का उपयोग किए बिना, एक फ़ंक्शन में पास (या-इन-प्लेस) को स्ट्रिंग में रिवर्स करते हैं, तो यह एक रिटर्न स्टेटमेंट के साथ एक फ़ंक्शन में जाता है ।
जवाबों:
जब तक आप सरल ASCII वर्णों के साथ काम कर रहे हैं, और आप अंतर्निहित कार्यों का उपयोग करके खुश हैं, यह काम करेगा:
function reverse(s){
return s.split("").reverse().join("");
}
यदि आपको एक समाधान की आवश्यकता है जो UTF-16 या अन्य मल्टी-बाइट वर्णों का समर्थन करता है, तो ध्यान रखें कि यह फ़ंक्शन अमान्य यूनिकोड स्ट्रिंग्स, या मान्य स्ट्रिंग्स जो मज़ेदार दिखाई देगा। आप इसके बजाय इस जवाब पर विचार करना चाह सकते हैं ।
[... एस] यूनिकोड से अवगत है, एक छोटा सा संपादन देता है: -
function reverse(s){
return [...s].reverse().join("");
}
return [...s].reverse().join("");
काम कर सकते हैं।
निम्नलिखित तकनीक (या समान) आमतौर पर जावास्क्रिप्ट में एक स्ट्रिंग को रिवर्स करने के लिए उपयोग की जाती है:
// Don’t use this!
var naiveReverse = function(string) {
return string.split('').reverse().join('');
}
वास्तव में, अब तक पोस्ट किए गए सभी उत्तर इस पैटर्न की भिन्नता है। हालांकि, इस समाधान के साथ कुछ समस्याएं हैं। उदाहरण के लिए:
naiveReverse('foo 𝌆 bar');
// → 'rab �� oof'
// Where did the `𝌆` symbol go? Whoops!
यदि आप सोच रहे हैं कि ऐसा क्यों होता है, तो जावास्क्रिप्ट के आंतरिक चरित्र एन्कोडिंग पर पढ़ें । (TL; DR: 𝌆
एक सूक्ष्म प्रतीक है, और जावास्क्रिप्ट इसे दो अलग-अलग कोड इकाइयों के रूप में उजागर करता है।)
लेकिन वहाँ अधिक है:
// To see which symbols are being used here, check:
// http://mothereff.in/js-escapes#1ma%C3%B1ana%20man%CC%83ana
naiveReverse('mañana mañana');
// → 'anãnam anañam'
// Wait, so now the tilde is applied to the `a` instead of the `n`? WAT.
स्ट्रिंग रिवर्स कार्यान्वयन का परीक्षण करने के लिए एक अच्छा स्ट्रिंग निम्न है :
'foo 𝌆 bar mañana mañana'
क्यों? क्योंकि इसमें एक सूक्ष्म प्रतीक ( 𝌆
) होता है (जो जावास्क्रिप्ट में सरोगेट जोड़े द्वारा दर्शाया जाता है ) और एक संयोजन चिह्न ( ñ
आखिरी में)mañana
वास्तव में दो प्रतीक होते हैं: U + 006E LATIN SMALL LETTER N और U + 0303 COININING TILDE)।
जिस क्रम में सरोगेट जोड़े दिखाई देते हैं उसे उलटा नहीं किया जा सकता है, अन्यथा सूक्ष्म प्रतीक 'उलट' स्ट्रिंग में दिखाई नहीं देगा। इसलिए आपने ��
पिछले उदाहरण के लिए आउटपुट में उन निशानों को देखा ।
संयोजन चिह्न हमेशा पिछले प्रतीक पर लागू होते हैं, इसलिए आपको दोनों मुख्य प्रतीक (U + 006E LATIN SMALL LETTER N) को समग्र रूप से संयोजन चिह्न (U + 0303 COMBINING TILDE) के रूप में मानना होगा। उनके आदेश को उलटने से स्ट्रिंग में दूसरे चिन्ह के साथ संयोजन चिह्न जुड़ जाएगा। इसलिए ã
इसके बजाय उदाहरण आउटपुट थाñ
।
उम्मीद है, यह बताता है कि अब तक पोस्ट किए गए सभी उत्तर गलत क्यों हैं ।
अपने प्रारंभिक प्रश्न का उत्तर देने के लिए - कैसे [ठीक से] एक स्ट्रिंग को जावास्क्रिप्ट में उल्टा करें -, मैंने एक छोटा जावास्क्रिप्ट पुस्तकालय लिखा है जो यूनिकोड-जागरूक स्ट्रिंग प्रत्यावर्तन में सक्षम है। यह मेरे द्वारा उल्लिखित मुद्दों में से कोई भी नहीं है। पुस्तकालय को Esrever कहा जाता है ; इसका कोड GitHub पर है, और यह किसी भी जावास्क्रिप्ट वातावरण में बहुत काम करता है। यह शेल यूटिलिटी / बाइनरी के साथ आता है, जिससे आप आसानी से अपने टर्मिनल से स्ट्रिंग्स को उल्टा कर सकते हैं।
var input = 'foo 𝌆 bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab 𝌆 oof'
"इन-प्लेस" भाग के लिए, अन्य उत्तर देखें।
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;
}
विस्तृत विश्लेषण और एक स्ट्रिंग और उनके प्रदर्शन विवरण को उलटने के दस अलग-अलग तरीके।
http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/
इन कार्यान्वयनों की पूर्णता:
प्रति ब्राउज़र सर्वश्रेष्ठ प्रदर्शन कार्यान्वयन (ओं)
यहाँ उन कार्यान्वयन हैं:
कार्यान्वयन 1:
function reverse(s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
कार्यान्वयन 2:
function reverse(s) {
var o = [];
for (var i = s.length - 1, j = 0; i >= 0; i--, j++)
o[j] = s[i];
return o.join('');
}
कार्यान्वयन 3:
function reverse(s) {
var o = [];
for (var i = 0, len = s.length; i <= len; i++)
o.push(s.charAt(len - i));
return o.join('');
}
कार्यान्वयन 4:
function reverse(s) {
return s.split('').reverse().join('');
}
कार्यान्वयन 5:
function reverse(s) {
var i = s.length,
o = '';
while (i > 0) {
o += s.substring(i - 1, i);
i--;
}
return o;
}
कार्यान्वयन 6:
function reverse(s) {
for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
return o;
}
कार्यान्वयन 7:
function reverse(s) {
return (s === '') ? '' : reverse(s.substr(1)) + s.charAt(0);
}
कार्यान्वयन 8:
function reverse(s) {
function rev(s, len, o) {
return (len === 0) ? o : rev(s, --len, (o += s[len]));
};
return rev(s, s.length, '');
}
कार्यान्वयन 9:
function reverse(s) {
s = s.split('');
var len = s.length,
halfIndex = Math.floor(len / 2) - 1,
tmp;
for (var i = 0; i <= halfIndex; i++) {
tmp = s[len - i - 1];
s[len - i - 1] = s[i];
s[i] = tmp;
}
return s.join('');
}
कार्यान्वयन 10
function reverse(s) {
if (s.length < 2)
return s;
var halfIndex = Math.ceil(s.length / 2);
return reverse(s.substr(halfIndex)) +
reverse(s.substr(0, halfIndex));
}
पूरे "रिवर्स ए स्ट्रिंग इन प्लेस" एक पुरातन साक्षात्कार साक्षात्कार सी प्रोग्रामर है, और जो लोग उनके द्वारा साक्षात्कार किया गया था (बदला लेने के लिए, शायद?), पूछेंगे। दुर्भाग्य से, यह "इन प्लेस" भाग है जो अब काम नहीं करता है क्योंकि किसी भी प्रबंधित भाषा में स्ट्रिंग्स (जेएस, सी #, आदि) अपरिवर्तनीय स्ट्रिंग्स का उपयोग करता है, इस प्रकार किसी भी नई मेमोरी को आवंटित किए बिना एक स्ट्रिंग को स्थानांतरित करने के पूरे विचार को हरा देता है।
जबकि ऊपर दिए गए समाधान वास्तव में एक स्ट्रिंग को उल्टा करते हैं, वे इसे अधिक मेमोरी आवंटित किए बिना नहीं करते हैं, और इस प्रकार शर्तों को संतुष्ट नहीं करते हैं। आपको आवंटित के रूप में स्ट्रिंग तक सीधे पहुंच की आवश्यकता है, और इसके मूल स्मृति स्थान में हेरफेर करने में सक्षम होने के लिए इसे जगह में उलट करने में सक्षम होना चाहिए।
व्यक्तिगत रूप से, मैं वास्तव में इस प्रकार के साक्षात्कार प्रश्नों से घृणा करता हूं, लेकिन दुख की बात है कि मुझे यकीन है कि हम उन्हें आने वाले वर्षों तक देखते रहेंगे।
सबसे पहले, Array.from()
एक स्ट्रिंग को एक सरणी में बदलने के लिए, फिर सरणी Array.prototype.reverse()
को उलटने के लिए और फिर Array.prototype.join()
इसे वापस स्ट्रिंग बनाने के लिए उपयोग करें।
const reverse = str => Array.from(str).reverse().join('');
reverse
तर्क का कोई पुनर्लेखन नहीं है।
string.split('')
काम नहीं करता है। अधिक स्पष्टीकरण के लिए इस उत्तर को देखें ।
Array.from('foo 𝌆 bar mañana mañana').reverse().join('') == 'anãnam anañam rab 𝌆 oof'
Array.from('foo 𝌆 bar mañana mañana'.normalize('NFC')).reverse().join('')
बन जाएगा"anañam anañam rab 𝌆 oof"
ECMAScript 6 में, आप स्प्रेड.split('')
विधि का उपयोग किए बिना किसी स्ट्रिंग को तेजी से उल्टा कर सकते हैं , जैसे स्प्रेड ऑपरेटर के साथ :
var str = [...'racecar'].reverse().join('');
string.split('')
ज्यादातर लोगों की तुलना में स्पष्ट है [...string]
।
.split('')
में अनुपूरक विमानों (UTF-16 में सरोगेट जोड़े) के पात्रों के साथ समस्या है, क्योंकि यह कोड बिंदु के बजाय UTF-16 कोड इकाई द्वारा विभाजित है । प्रसार ऑपरेटर और (मेरी प्राथमिकता) नहीं है। Array.from()
लगता है कि मुझे पार्टी में 3 साल देर हो गई है ...
दुर्भाग्य से आप के रूप में इंगित नहीं किया गया है। देखें क्या जावास्क्रिप्ट तार अपरिवर्तनीय? क्या मुझे जावास्क्रिप्ट में "स्ट्रिंग बिल्डर" की आवश्यकता है?
अगली सबसे अच्छी चीज जो आप कर सकते हैं वह है "व्यू" या "रैपर" बनाना, जो एक स्ट्रिंग लेता है और आपके द्वारा उपयोग किए जा रहे स्ट्रिंग एपीआई के कुछ हिस्सों को पुन: लागू करता है, लेकिन स्ट्रिंग का दिखावा उल्टा होता है। उदाहरण के लिए:
var identity = function(x){return x};
function LazyString(s) {
this.original = s;
this.length = s.length;
this.start = 0; this.stop = this.length; this.dir = 1; // "virtual" slicing
// (dir=-1 if reversed)
this._caseTransform = identity;
}
// syntactic sugar to create new object:
function S(s) {
return new LazyString(s);
}
//We now implement a `"...".reversed` which toggles a flag which will change our math:
(function(){ // begin anonymous scope
var x = LazyString.prototype;
// Addition to the String API
x.reversed = function() {
var s = new LazyString(this.original);
s.start = this.stop - this.dir;
s.stop = this.start - this.dir;
s.dir = -1*this.dir;
s.length = this.length;
s._caseTransform = this._caseTransform;
return s;
}
//We also override string coercion for some extra versatility (not really necessary):
// OVERRIDE STRING COERCION
// - for string concatenation e.g. "abc"+reversed("abc")
x.toString = function() {
if (typeof this._realized == 'undefined') { // cached, to avoid recalculation
this._realized = this.dir==1 ?
this.original.slice(this.start,this.stop) :
this.original.slice(this.stop+1,this.start+1).split("").reverse().join("");
this._realized = this._caseTransform.call(this._realized, this._realized);
}
return this._realized;
}
//Now we reimplement the String API by doing some math:
// String API:
// Do some math to figure out which character we really want
x.charAt = function(i) {
return this.slice(i, i+1).toString();
}
x.charCodeAt = function(i) {
return this.slice(i, i+1).toString().charCodeAt(0);
}
// Slicing functions:
x.slice = function(start,stop) {
// lazy chaining version of https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice
if (stop===undefined)
stop = this.length;
var relativeStart = start<0 ? this.length+start : start;
var relativeStop = stop<0 ? this.length+stop : stop;
if (relativeStart >= this.length)
relativeStart = this.length;
if (relativeStart < 0)
relativeStart = 0;
if (relativeStop > this.length)
relativeStop = this.length;
if (relativeStop < 0)
relativeStop = 0;
if (relativeStop < relativeStart)
relativeStop = relativeStart;
var s = new LazyString(this.original);
s.length = relativeStop - relativeStart;
s.start = this.start + this.dir*relativeStart;
s.stop = s.start + this.dir*s.length;
s.dir = this.dir;
//console.log([this.start,this.stop,this.dir,this.length], [s.start,s.stop,s.dir,s.length])
s._caseTransform = this._caseTransform;
return s;
}
x.substring = function() {
// ...
}
x.substr = function() {
// ...
}
//Miscellaneous functions:
// Iterative search
x.indexOf = function(value) {
for(var i=0; i<this.length; i++)
if (value==this.charAt(i))
return i;
return -1;
}
x.lastIndexOf = function() {
for(var i=this.length-1; i>=0; i--)
if (value==this.charAt(i))
return i;
return -1;
}
// The following functions are too complicated to reimplement easily.
// Instead just realize the slice and do it the usual non-in-place way.
x.match = function() {
var s = this.toString();
return s.apply(s, arguments);
}
x.replace = function() {
var s = this.toString();
return s.apply(s, arguments);
}
x.search = function() {
var s = this.toString();
return s.apply(s, arguments);
}
x.split = function() {
var s = this.toString();
return s.apply(s, arguments);
}
// Case transforms:
x.toLowerCase = function() {
var s = new LazyString(this.original);
s._caseTransform = ''.toLowerCase;
s.start=this.start; s.stop=this.stop; s.dir=this.dir; s.length=this.length;
return s;
}
x.toUpperCase = function() {
var s = new LazyString(this.original);
s._caseTransform = ''.toUpperCase;
s.start=this.start; s.stop=this.stop; s.dir=this.dir; s.length=this.length;
return s;
}
})() // end anonymous scope
डेमो:
> r = S('abcABC')
LazyString
original: "abcABC"
__proto__: LazyString
> r.charAt(1); // doesn't reverse string!!! (good if very long)
"B"
> r.toLowerCase() // must reverse string, so does so
"cbacba"
> r.toUpperCase() // string already reversed: no extra work
"CBACBA"
> r + '-demo-' + r // natural coercion, string already reversed: no extra work
"CBAcba-demo-CBAcba"
किकर - निम्नलिखित को शुद्ध गणित द्वारा किया जाता है, प्रत्येक वर्ण पर केवल एक बार जाकर, और केवल आवश्यक होने पर:
> 'demo: ' + S('0123456789abcdef').slice(3).reversed().slice(1,-1).toUpperCase()
"demo: EDCBA987654"
> S('0123456789ABCDEF').slice(3).reversed().slice(1,-1).toLowerCase().charAt(3)
"b"
यदि आप केवल एक अपेक्षाकृत छोटे स्लाइस ले रहे हैं, तो यह बहुत बड़ी स्ट्रिंग पर लागू होने पर महत्वपूर्ण बचत देता है।
क्या यह इसके लायक है (अधिकांश प्रोग्रामिंग भाषाओं में उलट-ए-कॉपी की तरह) अत्यधिक आपके उपयोग के मामले पर निर्भर करता है और आप स्ट्रिंग एपीआई को कितनी कुशलता से लागू करते हैं। उदाहरण के लिए, यदि आप चाहते हैं कि स्ट्रिंग इंडेक्स में हेरफेर करना है, या छोटे slice
एस या substr
एस लेना है, तो यह आपको स्थान और समय बचाएगा। यदि आप बड़े उलटे स्लाइस या सबस्ट्रिंग को प्रिंट करने की योजना बना रहे हैं, तो बचत वास्तव में छोटी हो सकती है, यहां तक कि पूर्ण प्रतिलिपि बनाने से भी बदतर। आपके "उलट" स्ट्रिंग का प्रकार भी नहीं होगा string
, हालांकि आप इसे प्रोटोटाइप के साथ नकली करने में सक्षम हो सकते हैं।
उपरोक्त डेमो कार्यान्वयन, Rev RevStString प्रकार का एक नया ऑब्जेक्ट बनाता है। यह प्रोटोटाइप है, और इसलिए काफी कुशल है, लगभग न्यूनतम काम और न्यूनतम स्थान के साथ ओवरहेड (प्रोटोटाइप परिभाषाएं साझा की जाती हैं)। यह एक आलसी कार्यान्वयन है जिसमें आस्थगित कताई शामिल है। जब भी आप किसी फ़ंक्शन को पसंद करते हैं .slice
या .reversed
, यह इंडेक्स गणित का प्रदर्शन करेगा। अंत में जब आप डेटा निकालते हैं (संक्षेप में कॉल करके .toString()
या.charCodeAt(...)
कुछ और करके), तो यह "स्मार्ट" तरीके से लागू होगा, कम से कम डेटा को छू सकता है।
नोट: उपरोक्त स्ट्रिंग एपीआई एक उदाहरण है, और इसे पूरी तरह से लागू नहीं किया जा सकता है। आप केवल 1-2 फ़ंक्शन का उपयोग कर सकते हैं, जिनकी आपको आवश्यकता है।
कई तरीके हैं जो आप जावास्क्रिप्ट में एक स्ट्रिंग को उल्टा कर सकते हैं। मैं उन तीन तरीकों को पसंद कर रहा हूं जो मुझे पसंद हैं।
दृष्टिकोण 1: रिवर्स फ़ंक्शन का उपयोग करना:
function reverse(str) {
return str.split('').reverse().join('');
}
दृष्टिकोण 2: पात्रों के माध्यम से लूपिंग:
function reverse(str) {
let reversed = '';
for (let character of str) {
reversed = character + reversed;
}
return reversed;
}
दृष्टिकोण 3: समारोह को कम करने का उपयोग करना:
function reverse(str) {
return str.split('').reduce((rev, char) => char + rev, '');
}
आशा है कि ये आपकी मदद करेगा :)
एक साक्षात्कार के दौरान, मुझे किसी भी चर या देशी तरीकों का उपयोग किए बिना एक स्ट्रिंग को रिवर्स करने के लिए कहा गया था। यह मेरा पसंदीदा कार्यान्वयन है:
function reverseString(str) {
return str === '' ? '' : reverseString(str.slice(1)) + str[0];
}
slice
? : - /
Array.prototype.reverse()
।
इसे करने के कई तरीके हैं, आप निम्नलिखित की जांच कर सकते हैं,
1. पारंपरिक लूप के लिए (वेतन वृद्धि):
function reverseString(str){
let stringRev ="";
for(let i= 0; i<str.length; i++){
stringRev = str[i]+stringRev;
}
return stringRev;
}
alert(reverseString("Hello World!"));
2. पारंपरिक लूप के लिए (डिक्रिमेंटिंग):
function reverseString(str){
let revstr = "";
for(let i = str.length-1; i>=0; i--){
revstr = revstr+ str[i];
}
return revstr;
}
alert(reverseString("Hello World!"));
3. लूप के लिए उपयोग करना
function reverseString(str){
let strn ="";
for(let char of str){
strn = char + strn;
}
return strn;
}
alert(reverseString("Get well soon"));
4. forEach / उच्च आदेश सरणी विधि का उपयोग:
function reverseString(str){
let revSrring = "";
str.split("").forEach(function(char){
revSrring = char + revSrring;
});
return revSrring;
}
alert(reverseString("Learning JavaScript"));
5. ES6 मानक:
function reverseString(str){
let revSrring = "";
str.split("").forEach(char => revSrring = char + revSrring);
return revSrring;
}
alert(reverseString("Learning JavaScript"));
6. नवीनतम तरीका:
function reverseString(str){
return str.split("").reduce(function(revString, char){
return char + revString;
}, "");
}
alert(reverseString("Learning JavaScript"));
7. आपको निम्नलिखित का उपयोग करके भी परिणाम मिल सकता है,
function reverseString(str){
return str.split("").reduce((revString, char)=> char + revString, "");
}
alert(reverseString("Learning JavaScript"));
ES6 में, आपके पास एक और विकल्प है
function reverseString (str) {
return [...str].reverse().join('')
}
reverseString('Hello');
मेरे हिसाब से यह सबसे आसान तरीका है
var reverse = function(str) {
var arr = [];
for (var i = 0, len = str.length; i <= len; i++) {
arr.push(str.charAt(len - i))
}
return arr.join('');
}
console.log(reverse('I want a 🍺'));
Array.prototype.reverse()
सबसे आसान तरीका है, इसलिए सबसे लोकप्रिय उत्तर है। बेशक, इसे जावास्क्रिप्ट के पहले अच्छे ज्ञान की आवश्यकता होगी।
मुझे पता है कि यह एक पुराना प्रश्न है जिसका उत्तर अच्छी तरह से दिया गया है, लेकिन अपने स्वयं के मनोरंजन के लिए मैंने निम्नलिखित रिवर्स फ़ंक्शन लिखा और सोचा कि मैं इसे किसी और के लिए उपयोगी होने पर साझा करूंगा। यह सरोगेट जोड़े और संयोजन अंक दोनों को संभालता है:
function StringReverse (str)
{
var charArray = [];
for (var i = 0; i < str.length; i++)
{
if (i+1 < str.length)
{
var value = str.charCodeAt(i);
var nextValue = str.charCodeAt(i+1);
if ( ( value >= 0xD800 && value <= 0xDBFF
&& (nextValue & 0xFC00) == 0xDC00) // Surrogate pair)
|| (nextValue >= 0x0300 && nextValue <= 0x036F)) // Combining marks
{
charArray.unshift(str.substring(i, i+2));
i++; // Skip the other half
continue;
}
}
// Otherwise we just have a rogue surrogate marker or a plain old character.
charArray.unshift(str[i]);
}
return charArray.join('');
}
सभी प्रॉप्स मैथियास, पनीकोड, और मुझे जावास्क्रिप्ट में चरित्र एन्कोडिंग की जटिलताओं पर स्कूली शिक्षा के लिए अन्य विभिन्न संदर्भों के लिए।
आप नहीं कर सकते क्योंकि जेएस तार अपरिवर्तनीय हैं। लघु गैर-इन-प्लेस समाधान
[...str].reverse().join``
यदि आप किसी भी फ़ंक्शन का उपयोग नहीं करना चाहते हैं। इसे इस्तेमाल करे
var string = 'abcdefg';
var newstring = '';
for(let i = 0; i < string.length; i++){
newstring = string[i] += newstring;
}
console.log(newstring);
वास्तविक उत्तर यह है: आप इसे जगह में उलट नहीं सकते हैं, लेकिन आप एक नया स्ट्रिंग बना सकते हैं जो रिवर्स है।
बस पुनरावृत्ति के साथ खेलने के लिए एक अभ्यास के रूप में: कभी-कभी जब आप किसी साक्षात्कार में जाते हैं, तो साक्षात्कारकर्ता आपसे पूछ सकता है कि पुनरावृत्ति का उपयोग करके यह कैसे करें, और मुझे लगता है कि "पसंदीदा उत्तर" हो सकता है "मैं इसे पुनरावृत्ति में नहीं करूंगा क्योंकि यह आसानी से स्टैक ओवरफ़्लो का कारण बन सकता है "(क्योंकि यह इसके O(n)
बजाय है O(log n)
। यदि यह है O(log n)
, तो स्टैक ओवरफ़्लो प्राप्त करना काफी मुश्किल है - 4 बिलियन आइटम 32 के स्टैक स्तर द्वारा नियंत्रित किया जा सकता है, क्योंकि 2 ** 32 4294967296 है। लेकिन अगर ऐसा हैO(n)
, तो यह आसानी से एक ढेर अतिप्रवाह प्राप्त कर सकता है।
कभी-कभी साक्षात्कारकर्ता आपसे अभी भी पूछेगा, "सिर्फ एक अभ्यास के रूप में, आप अभी भी इसे पुनरावृत्ति का उपयोग करके क्यों नहीं लिखते हैं?" और यहाँ यह है:
String.prototype.reverse = function() {
if (this.length <= 1) return this;
else return this.slice(1).reverse() + this.slice(0,1);
}
परीक्षण चालन:
var s = "";
for(var i = 0; i < 1000; i++) {
s += ("apple" + i);
}
console.log(s.reverse());
उत्पादन:
999elppa899elppa...2elppa1elppa0elppa
स्टैक ओवरफ़्लो प्राप्त करने की कोशिश करने के लिए, मैंने Google Chrome में परिवर्तन 1000
किया 10000
, और यह बताया:
RangeError: Maximum call stack size exceeded
//es6
//array.from
const reverseString = (string) => Array.from(string).reduce((a, e) => e + a);
//split
const reverseString = (string) => string.split('').reduce((a, e) => e + a);
//split problem
"𠜎𠺢".split('')[0] === Array.from("𠜎𠺢")[0] // "�" === "𠜎" => false
"😂😹🤗".split('')[0] === Array.from("😂😹🤗")[0] // "�" === "😂" => false
एक छोटा सा कार्य जो दोनों डायट्रीक्टिक्स और 2-बाइट वर्णों को संयोजित करता है:
(function(){
var isCombiningDiacritic = function( code )
{
return (0x0300 <= code && code <= 0x036F) // Comb. Diacritical Marks
|| (0x1AB0 <= code && code <= 0x1AFF) // Comb. Diacritical Marks Extended
|| (0x1DC0 <= code && code <= 0x1DFF) // Comb. Diacritical Marks Supplement
|| (0x20D0 <= code && code <= 0x20FF) // Comb. Diacritical Marks for Symbols
|| (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks
};
String.prototype.reverse = function()
{
var output = "",
i = this.length - 1,
width;
for ( ; i >= 0; --i )
{
width = 1;
while( i > 0 && isCombiningDiacritic( this.charCodeAt(i) ) )
{
--i;
width++;
}
if (
i > 0
&& "\uDC00" <= this[i] && this[i] <= "\uDFFF"
&& "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF"
)
{
--i;
width++;
}
output += this.substr( i, width );
}
return output;
}
})();
// Tests
[
'abcdefg',
'ab\u0303c',
'a\uD83C\uDFA5b',
'a\uD83C\uDFA5b\uD83C\uDFA6c',
'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d',
'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡' // copied from http://stackoverflow.com/a/1732454/1509264
].forEach(
function(str){ console.log( str + " -> " + str.reverse() ); }
);
अपडेट करें
नृतत्वशास्त्र के संयोजन की एक और पूरी सूची है:
var isCombiningDiacritic = function( code )
{
return (0x0300 <= code && code <= 0x036F)
|| (0x0483 <= code && code <= 0x0489)
|| (0x0591 <= code && code <= 0x05BD)
|| (code == 0x05BF)
|| (0x05C1 <= code && code <= 0x05C2)
|| (0x05C4 <= code && code <= 0x05C5)
|| (code == 0x05C7)
|| (0x0610 <= code && code <= 0x061A)
|| (0x064B <= code && code <= 0x065F)
|| (code == 0x0670)
|| (0x06D6 <= code && code <= 0x06DC)
|| (0x06DF <= code && code <= 0x06E4)
|| (0x06E7 <= code && code <= 0x06E8)
|| (0x06EA <= code && code <= 0x06ED)
|| (code == 0x0711)
|| (0x0730 <= code && code <= 0x074A)
|| (0x07A6 <= code && code <= 0x07B0)
|| (0x07EB <= code && code <= 0x07F3)
|| (code == 0x07FD)
|| (0x0816 <= code && code <= 0x0819)
|| (0x081B <= code && code <= 0x0823)
|| (0x0825 <= code && code <= 0x0827)
|| (0x0829 <= code && code <= 0x082D)
|| (0x0859 <= code && code <= 0x085B)
|| (0x08D3 <= code && code <= 0x08E1)
|| (0x08E3 <= code && code <= 0x0902)
|| (code == 0x093A)
|| (code == 0x093C)
|| (0x0941 <= code && code <= 0x0948)
|| (code == 0x094D)
|| (0x0951 <= code && code <= 0x0957)
|| (0x0962 <= code && code <= 0x0963)
|| (code == 0x0981)
|| (code == 0x09BC)
|| (0x09C1 <= code && code <= 0x09C4)
|| (code == 0x09CD)
|| (0x09E2 <= code && code <= 0x09E3)
|| (0x09FE <= code && code <= 0x0A02)
|| (code == 0x0A3C)
|| (0x0A41 <= code && code <= 0x0A51)
|| (0x0A70 <= code && code <= 0x0A71)
|| (code == 0x0A75)
|| (0x0A81 <= code && code <= 0x0A82)
|| (code == 0x0ABC)
|| (0x0AC1 <= code && code <= 0x0AC8)
|| (code == 0x0ACD)
|| (0x0AE2 <= code && code <= 0x0AE3)
|| (0x0AFA <= code && code <= 0x0B01)
|| (code == 0x0B3C)
|| (code == 0x0B3F)
|| (0x0B41 <= code && code <= 0x0B44)
|| (0x0B4D <= code && code <= 0x0B56)
|| (0x0B62 <= code && code <= 0x0B63)
|| (code == 0x0B82)
|| (code == 0x0BC0)
|| (code == 0x0BCD)
|| (code == 0x0C00)
|| (code == 0x0C04)
|| (0x0C3E <= code && code <= 0x0C40)
|| (0x0C46 <= code && code <= 0x0C56)
|| (0x0C62 <= code && code <= 0x0C63)
|| (code == 0x0C81)
|| (code == 0x0CBC)
|| (0x0CCC <= code && code <= 0x0CCD)
|| (0x0CE2 <= code && code <= 0x0CE3)
|| (0x0D00 <= code && code <= 0x0D01)
|| (0x0D3B <= code && code <= 0x0D3C)
|| (0x0D41 <= code && code <= 0x0D44)
|| (code == 0x0D4D)
|| (0x0D62 <= code && code <= 0x0D63)
|| (code == 0x0DCA)
|| (0x0DD2 <= code && code <= 0x0DD6)
|| (code == 0x0E31)
|| (0x0E34 <= code && code <= 0x0E3A)
|| (0x0E47 <= code && code <= 0x0E4E)
|| (code == 0x0EB1)
|| (0x0EB4 <= code && code <= 0x0EBC)
|| (0x0EC8 <= code && code <= 0x0ECD)
|| (0x0F18 <= code && code <= 0x0F19)
|| (code == 0x0F35)
|| (code == 0x0F37)
|| (code == 0x0F39)
|| (0x0F71 <= code && code <= 0x0F7E)
|| (0x0F80 <= code && code <= 0x0F84)
|| (0x0F86 <= code && code <= 0x0F87)
|| (0x0F8D <= code && code <= 0x0FBC)
|| (code == 0x0FC6)
|| (0x102D <= code && code <= 0x1030)
|| (0x1032 <= code && code <= 0x1037)
|| (0x1039 <= code && code <= 0x103A)
|| (0x103D <= code && code <= 0x103E)
|| (0x1058 <= code && code <= 0x1059)
|| (0x105E <= code && code <= 0x1060)
|| (0x1071 <= code && code <= 0x1074)
|| (code == 0x1082)
|| (0x1085 <= code && code <= 0x1086)
|| (code == 0x108D)
|| (code == 0x109D)
|| (0x135D <= code && code <= 0x135F)
|| (0x1712 <= code && code <= 0x1714)
|| (0x1732 <= code && code <= 0x1734)
|| (0x1752 <= code && code <= 0x1753)
|| (0x1772 <= code && code <= 0x1773)
|| (0x17B4 <= code && code <= 0x17B5)
|| (0x17B7 <= code && code <= 0x17BD)
|| (code == 0x17C6)
|| (0x17C9 <= code && code <= 0x17D3)
|| (code == 0x17DD)
|| (0x180B <= code && code <= 0x180D)
|| (0x1885 <= code && code <= 0x1886)
|| (code == 0x18A9)
|| (0x1920 <= code && code <= 0x1922)
|| (0x1927 <= code && code <= 0x1928)
|| (code == 0x1932)
|| (0x1939 <= code && code <= 0x193B)
|| (0x1A17 <= code && code <= 0x1A18)
|| (code == 0x1A1B)
|| (code == 0x1A56)
|| (0x1A58 <= code && code <= 0x1A60)
|| (code == 0x1A62)
|| (0x1A65 <= code && code <= 0x1A6C)
|| (0x1A73 <= code && code <= 0x1A7F)
|| (0x1AB0 <= code && code <= 0x1B03)
|| (code == 0x1B34)
|| (0x1B36 <= code && code <= 0x1B3A)
|| (code == 0x1B3C)
|| (code == 0x1B42)
|| (0x1B6B <= code && code <= 0x1B73)
|| (0x1B80 <= code && code <= 0x1B81)
|| (0x1BA2 <= code && code <= 0x1BA5)
|| (0x1BA8 <= code && code <= 0x1BA9)
|| (0x1BAB <= code && code <= 0x1BAD)
|| (code == 0x1BE6)
|| (0x1BE8 <= code && code <= 0x1BE9)
|| (code == 0x1BED)
|| (0x1BEF <= code && code <= 0x1BF1)
|| (0x1C2C <= code && code <= 0x1C33)
|| (0x1C36 <= code && code <= 0x1C37)
|| (0x1CD0 <= code && code <= 0x1CD2)
|| (0x1CD4 <= code && code <= 0x1CE0)
|| (0x1CE2 <= code && code <= 0x1CE8)
|| (code == 0x1CED)
|| (code == 0x1CF4)
|| (0x1CF8 <= code && code <= 0x1CF9)
|| (0x1DC0 <= code && code <= 0x1DFF)
|| (0x20D0 <= code && code <= 0x20F0)
|| (0x2CEF <= code && code <= 0x2CF1)
|| (code == 0x2D7F)
|| (0x2DE0 <= code && code <= 0x2DFF)
|| (0x302A <= code && code <= 0x302D)
|| (0x3099 <= code && code <= 0x309A)
|| (0xA66F <= code && code <= 0xA672)
|| (0xA674 <= code && code <= 0xA67D)
|| (0xA69E <= code && code <= 0xA69F)
|| (0xA6F0 <= code && code <= 0xA6F1)
|| (code == 0xA802)
|| (code == 0xA806)
|| (code == 0xA80B)
|| (0xA825 <= code && code <= 0xA826)
|| (0xA8C4 <= code && code <= 0xA8C5)
|| (0xA8E0 <= code && code <= 0xA8F1)
|| (code == 0xA8FF)
|| (0xA926 <= code && code <= 0xA92D)
|| (0xA947 <= code && code <= 0xA951)
|| (0xA980 <= code && code <= 0xA982)
|| (code == 0xA9B3)
|| (0xA9B6 <= code && code <= 0xA9B9)
|| (0xA9BC <= code && code <= 0xA9BD)
|| (code == 0xA9E5)
|| (0xAA29 <= code && code <= 0xAA2E)
|| (0xAA31 <= code && code <= 0xAA32)
|| (0xAA35 <= code && code <= 0xAA36)
|| (code == 0xAA43)
|| (code == 0xAA4C)
|| (code == 0xAA7C)
|| (code == 0xAAB0)
|| (0xAAB2 <= code && code <= 0xAAB4)
|| (0xAAB7 <= code && code <= 0xAAB8)
|| (0xAABE <= code && code <= 0xAABF)
|| (code == 0xAAC1)
|| (0xAAEC <= code && code <= 0xAAED)
|| (code == 0xAAF6)
|| (code == 0xABE5)
|| (code == 0xABE8)
|| (code == 0xABED)
|| (code == 0xFB1E)
|| (0xFE00 <= code && code <= 0xFE0F)
|| (0xFE20 <= code && code <= 0xFE2F)
|| (code == 0x101FD)
|| (code == 0x102E0)
|| (0x10376 <= code && code <= 0x1037A)
|| (0x10A01 <= code && code <= 0x10A0F)
|| (0x10A38 <= code && code <= 0x10A3F)
|| (0x10AE5 <= code && code <= 0x10AE6)
|| (0x10D24 <= code && code <= 0x10D27)
|| (0x10F46 <= code && code <= 0x10F50)
|| (code == 0x11001)
|| (0x11038 <= code && code <= 0x11046)
|| (0x1107F <= code && code <= 0x11081)
|| (0x110B3 <= code && code <= 0x110B6)
|| (0x110B9 <= code && code <= 0x110BA)
|| (0x11100 <= code && code <= 0x11102)
|| (0x11127 <= code && code <= 0x1112B)
|| (0x1112D <= code && code <= 0x11134)
|| (code == 0x11173)
|| (0x11180 <= code && code <= 0x11181)
|| (0x111B6 <= code && code <= 0x111BE)
|| (0x111C9 <= code && code <= 0x111CC)
|| (0x1122F <= code && code <= 0x11231)
|| (code == 0x11234)
|| (0x11236 <= code && code <= 0x11237)
|| (code == 0x1123E)
|| (code == 0x112DF)
|| (0x112E3 <= code && code <= 0x112EA)
|| (0x11300 <= code && code <= 0x11301)
|| (0x1133B <= code && code <= 0x1133C)
|| (code == 0x11340)
|| (0x11366 <= code && code <= 0x11374)
|| (0x11438 <= code && code <= 0x1143F)
|| (0x11442 <= code && code <= 0x11444)
|| (code == 0x11446)
|| (code == 0x1145E)
|| (0x114B3 <= code && code <= 0x114B8)
|| (code == 0x114BA)
|| (0x114BF <= code && code <= 0x114C0)
|| (0x114C2 <= code && code <= 0x114C3)
|| (0x115B2 <= code && code <= 0x115B5)
|| (0x115BC <= code && code <= 0x115BD)
|| (0x115BF <= code && code <= 0x115C0)
|| (0x115DC <= code && code <= 0x115DD)
|| (0x11633 <= code && code <= 0x1163A)
|| (code == 0x1163D)
|| (0x1163F <= code && code <= 0x11640)
|| (code == 0x116AB)
|| (code == 0x116AD)
|| (0x116B0 <= code && code <= 0x116B5)
|| (code == 0x116B7)
|| (0x1171D <= code && code <= 0x1171F)
|| (0x11722 <= code && code <= 0x11725)
|| (0x11727 <= code && code <= 0x1172B)
|| (0x1182F <= code && code <= 0x11837)
|| (0x11839 <= code && code <= 0x1183A)
|| (0x119D4 <= code && code <= 0x119DB)
|| (code == 0x119E0)
|| (0x11A01 <= code && code <= 0x11A06)
|| (0x11A09 <= code && code <= 0x11A0A)
|| (0x11A33 <= code && code <= 0x11A38)
|| (0x11A3B <= code && code <= 0x11A3E)
|| (code == 0x11A47)
|| (0x11A51 <= code && code <= 0x11A56)
|| (0x11A59 <= code && code <= 0x11A5B)
|| (0x11A8A <= code && code <= 0x11A96)
|| (0x11A98 <= code && code <= 0x11A99)
|| (0x11C30 <= code && code <= 0x11C3D)
|| (0x11C92 <= code && code <= 0x11CA7)
|| (0x11CAA <= code && code <= 0x11CB0)
|| (0x11CB2 <= code && code <= 0x11CB3)
|| (0x11CB5 <= code && code <= 0x11CB6)
|| (0x11D31 <= code && code <= 0x11D45)
|| (code == 0x11D47)
|| (0x11D90 <= code && code <= 0x11D91)
|| (code == 0x11D95)
|| (code == 0x11D97)
|| (0x11EF3 <= code && code <= 0x11EF4)
|| (0x16AF0 <= code && code <= 0x16AF4)
|| (0x16B30 <= code && code <= 0x16B36)
|| (code == 0x16F4F)
|| (0x16F8F <= code && code <= 0x16F92)
|| (0x1BC9D <= code && code <= 0x1BC9E)
|| (0x1D167 <= code && code <= 0x1D169)
|| (0x1D17B <= code && code <= 0x1D182)
|| (0x1D185 <= code && code <= 0x1D18B)
|| (0x1D1AA <= code && code <= 0x1D1AD)
|| (0x1D242 <= code && code <= 0x1D244)
|| (0x1DA00 <= code && code <= 0x1DA36)
|| (0x1DA3B <= code && code <= 0x1DA6C)
|| (code == 0x1DA75)
|| (code == 0x1DA84)
|| (0x1DA9B <= code && code <= 0x1E02A)
|| (0x1E130 <= code && code <= 0x1E136)
|| (0x1E2EC <= code && code <= 0x1E2EF)
|| (0x1E8D0 <= code && code <= 0x1E8D6)
|| (0x1E944 <= code && code <= 0x1E94A)
|| (0xE0100 <= code && code <= 0xE01EF);
};
isCombiningDiacritic
को सभी 316 सीमाओं को शामिल करने के लिए फ़ंक्शन को संपादित करना है; जब आप डेटा को हाथ लगाने के लिए प्रस्तुत करते हैं, तो उस संपादन को बेझिझक करें।
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 = function() {
var ret = "";
var size = 0;
for (var i = this.length - 1; -1 < i; i -= size) {
if (
'\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' &&
'\uDC00' <= this[i] && this[i] <= '\uDFFF'
) {
size = 2;
ret += this[i - 1] + this[i];
} else {
size = 1;
ret += this[i];
}
}
return ret;
}
console.log('anãnam anañam' === 'mañana mañana'.reverse());
वर्णों को कोड बिंदुओं में परिवर्तित किए बिना Array.reverse का उपयोग करना;
String.prototype.reverse = function() {
var array = this.split("").reverse();
for (var i = 0; i < this.length; ++i) {
if (
'\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' &&
'\uDC00' <= this[i] && this[i] <= '\uDFFF'
) {
array[i - 1] = array[i - 1] + array[i];
array[i] = array[i - 1].substr(0, 1);
array[i - 1] = array[i - 1].substr(1, 1);
}
}
return array.join("");
}
console.log('anãnam anañam' === 'mañana mañana'.reverse());
var c = array[i-1]; array[i-1] = array[i]; array[i] = c;
कोड जोड़ी को समवर्ती करने की आवश्यकता नहीं है। इसके अलावा, फॉर-लूप
'\ud83c\ud83c\udfa5'.reverse()
- यह इनपुट के समान आउटपुट देगा। बयान के ++i;
भीतर जोड़कर if
इसे ठीक करना चाहिए।
'a\u0303bc'.reverse() === 'cba\u0303'
सच लौटना चाहिए।
मुझे लगता है कि String.prototyp.reverse इस समस्या को हल करने का एक अच्छा तरीका है; नीचे के रूप में कोड;
String.prototype.reverse = function() {
return this.split('').reverse().join('');
}
var str = 'this is a good example for string reverse';
str.reverse();
-> "esrever gnirts rof elpmaxe doog a si siht";
var str = "my name is saurabh ";
var empStr='',finalString='';
var chunk=[];
function reverse(str){
var i,j=0,n=str.length;
for(i=0;i<n;++i){
if(str[i]===' '){
chunk[j]=empStr;
empStr = '';
j++;
}else{
empStr=empStr+str[i];
}
}
for(var z=chunk.length-1;z>=0;z--){
finalString = finalString +' '+ chunk[z];
console.log(finalString);
}
return true;
}
reverse(str);
मेरा अपना मूल प्रयास ...
var str = "The Car";
function reverseStr(str) {
var reversed = "";
var len = str.length;
for (var i = 1; i < (len + 1); i++) {
reversed += str[len - i];
}
return reversed;
}
var strReverse = reverseStr(str);
console.log(strReverse);
// "raC ehT"
इसे DRY और सरल मूर्खतापूर्ण रखें !!
function reverse(s){
let str = s;
var reverse = '';
for (var i=str.length;i>0;i--){
var newstr = str.substring(0,i)
reverse += newstr.substr(-1,1)
}
return reverse;
}
ठीक है, बहुत आसान है, आप एक सरल लूप के साथ एक फ़ंक्शन बना सकते हैं, ताकि आप बिना उपयोग किए स्ट्रिंग को उल्टा कर सकें reverse()
, charAt()
आदि:
उदाहरण के लिए आपके पास यह स्ट्रिंग है:
var name = "StackOverflow";
इस तरह एक समारोह बनाएँ, मैं इसे फोन reverseString
...
function reverseString(str) {
if(!str.trim() || 'string' !== typeof str) {
return;
}
let l=str.length, s='';
while(l > 0) {
l--;
s+= str[l];
}
return s;
}
और आप इसे कॉल कर सकते हैं जैसे:
reverseString(name);
और परिणाम होगा:
"wolfrevOkcatS"
जावास्क्रिप्ट में एक स्ट्रिंग को रिवर्स करने के सर्वोत्तम तरीके
1) Array.reverse:
आप शायद सोच रहे हैं, रुको मुझे लगा कि हम एक स्ट्रिंग को उल्टा कर रहे थे, आप ऐरे.वेवर्स विधि का उपयोग क्यों कर रहे हैं। String.split पद्धति का उपयोग करके हम अपने स्ट्रिंग को वर्णों के एक सरणी में परिवर्तित कर रहे हैं। फिर हम एरे में प्रत्येक मान के क्रम को उलट रहे हैं और फिर अंत में हम ऐरे को वापस आकर स्ट्रिंग में बदल देते हैं।
function reverseString(str) {
return str.split('').reverse().join('');
}
reverseString('dwayne');
2) घटते समय-पाश:
हालांकि सुंदर क्रिया, इस समाधान के समाधान एक पर इसके फायदे हैं। आप एक सरणी नहीं बना रहे हैं और आप केवल स्रोत स्ट्रिंग के वर्णों के आधार पर एक स्ट्रिंग को संक्षिप्त कर रहे हैं।
प्रदर्शन के दृष्टिकोण से, यह शायद सबसे अच्छा परिणाम देगा (हालांकि अप्रयुक्त)। बहुत लंबे समय तक तार के लिए, प्रदर्शन लाभ खिड़की से बाहर छोड़ सकते हैं।
function reverseString(str) {
var temp = '';
var i = str.length;
while (i > 0) {
temp += str.substring(i - 1, i);
i--;
}
return temp;
}
reverseString('dwayne');
3) पुनरावृत्ति
मुझे पसंद है कि यह समाधान कितना सरल और स्पष्ट है। आप स्पष्ट रूप से देख सकते हैं कि String.charAt और String.substr विधियों का उपयोग प्रत्येक बार खुद कॉल करके एक अलग मान से गुजरने के लिए किया जा रहा है, जब तक कि स्ट्रिंग खाली न हो जाए, जब तक टर्नरी स्वयं को कॉल करने के लिए पुनरावर्तन का उपयोग करने के बजाय एक खाली स्ट्रिंग वापस कर देगा। । यह संभवतः दूसरे समाधान के बाद दूसरा सर्वश्रेष्ठ प्रदर्शन होगा।
function reverseString(str) {
return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
}
reverseString('dwayne');