Dva načina za provjeru palindroma u JavaScript-u

Ovaj se članak temelji na skripti skripta algoritma Free Code Camp "Provjeri palindrome".

Palindrom je riječ, fraza, broj ili drugi niz znakova koji se čitaju unatrag ili naprijed. Riječ "palindrom" prvi je smislio engleski dramatičar Ben Jonson u 17. stoljeću, od grčkih korijena palin ("opet") i dromos ("put, smjer"). - src. Wikipedija

U ovom ću članku objasniti dva pristupa, prvi s ugrađenim funkcijama, a drugi pomoću for petlje.

Izazov algoritma

Vrati true ako je zadani niz palindrom. U suprotnom, vratite false.

Palindrom je riječ ili rečenica koja se piše na isti način i naprijed i natrag, zanemarujući interpunkciju, padež i razmak.

Bilješka. Morat ćete ukloniti sve ne-alfanumeričke znakove (interpunkcijske znakove, razmake i simbole) i sve okrenuti malim slovima kako biste provjerili postoje li palindromi.

Prolazit ćemo niz različitih formata, kao što su "racecar", "RaceCar" i "race CAR", između ostalog.

function palindrome(str) { return true; } palindrome("eye");

Dati test slučajevi

  • palindrom ("trkaći automobil") trebao bi se vratiti istinit
  • palindrom ("nije palindrom")treba vratiti false
  • palindrom ("Čovjek, plan, kanal. Panama") trebao bi se ostvariti
  • palindrom ("nikad neparan ili paran") trebao bi se vratiti istinit
  • palindrom ("ne") treba vratiti false
  • palindrom ("skoroomla") trebao bi vratiti false
  • palindrom ("Moja dob je 0, 0 si ega ym.") trebao bi se vratiti istinit
  • palindrom ("1 oko za 1 oko.") trebao bi se vratiti na false
  • palindrom (“0_0 (: / - \ :) 0–0”) treba vratiti true

Koji ćemo redoviti izraz trebati da bismo prošli zadnji test?

Regularni izrazi su obrasci koji se koriste za podudaranje kombinacija znakova u nizovima.

Kada potraga za podudaranjem zahtijeva nešto više od izravnog podudaranja, uzorak uključuje posebne znakove.

To pass the last test case, we can use two Regular Expressions: /[^A-Za-z0–9]/g or /[\W_]/g

\ W uklanja sve ne-alfanumeričke znakove :

  • \ W odgovara bilo kojem znaku koji nije riječ
  • \ W je ekvivalentno s [^ A-Za-z0–9_]
  • \ W se podudara sa svime što nije priloženo u zagradama

Što to znači?

[^A-Z] matches anything that is not enclosed between A and Z [^a-z] matches anything that is not enclosed between a and z [^0-9] matches anything that is not enclosed between 0 and 9 [^_] matches anything that does not enclose _

Ali u našem testnom slučaju trebamo palindrom (“ 0_0 (: / - \ :) 0–0 ”) da bismo vratili true , što znači da se “ _ (: / - \ :) - ” mora podudarati.

Morat ćemo dodati " _ " da bismo prošli ovaj specifični testni slučaj.

We now have “\W_”

Trebat ćemo dodati i zastavicu g za globalno pretraživanje.

We finally have “/[\W_]/g”
/ [\ W _] / g korišten je u čisto demonstrativne svrhe kako bi pokazao kako RegExp djeluje. / [^ A-Za-z0–9] / g je RegExp najlakši za odabir .

1. Provjerite postoje li palindromi s ugrađenim funkcijama

Za ovo rješenje koristit ćemo nekoliko metoda:

  • Metoda toLowerCase () za vraćanje vrijednosti pozivajućeg niza pretvorenu u mala slova.
  • Metoda replace () za vraćanje novog niza s nekim ili svim podudaranjima uzorka zamijenjenih zamjenom. Koristit ćemo jedan od RegExp-a koji smo upravo stvorili ranije.
  • Metoda split () razdvaja objekt String u niz nizova odvajanjem niza u podnizove.
  • Metoda reverse () preokreće niz na mjestu. Prvi element niza postaje posljednji, a posljednji postaje prvi.
  • Metoda join () spaja sve elemente niza u niz.
function palindrome(str) { // Step 1. Lowercase the string and use the RegExp to remove unwanted characters from it var re = /[\W_]/g; // or var re = /[^A-Za-z0-9]/g; var lowRegStr = str.toLowerCase().replace(re, ''); // str.toLowerCase() = "A man, a plan, a canal. Panama".toLowerCase() = "a man, a plan, a canal. panama" // str.replace(/[\W_]/g, '') = "a man, a plan, a canal. panama".replace(/[\W_]/g, '') = "amanaplanacanalpanama" // var lowRegStr = "amanaplanacanalpanama"; // Step 2. Use the same chaining methods with built-in functions from the previous article 'Three Ways to Reverse a String in JavaScript' var reverseStr = lowRegStr.split('').reverse().join(''); // lowRegStr.split('') = "amanaplanacanalpanama".split('') = ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"] // ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"].reverse() = ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"] // ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"].join('') = "amanaplanacanalpanama" // So, "amanaplanacanalpanama".split('').reverse().join('') = "amanaplanacanalpanama"; // And, var reverseStr = "amanaplanacanalpanama"; // Step 3. Check if reverseStr is strictly equals to lowRegStr and return a Boolean return reverseStr === lowRegStr; // "amanaplanacanalpanama" === "amanaplanacanalpanama"? => true } palindrome("A man, a plan, a canal. Panama");

Bez komentara:

function palindrome(str) { var re = /[\W_]/g; var lowRegStr = str.toLowerCase().replace(re, ''); var reverseStr = lowRegStr.split('').reverse().join(''); return reverseStr === lowRegStr; } palindrome("A man, a plan, a canal. Panama");

2. Provjerite palindrome s petljom FOR

Poluindeksiranje (len / 2) ima prednosti pri obradi velikih nizova. Provjeravamo kraj iz svakog dijela i broj iteracija unutar petlje FOR podijelimo s dva.

function palindrome(str) { // Step 1. The first part is the same as earlier var re = /[^A-Za-z0-9]/g; // or var re = /[\W_]/g; str = str.toLowerCase().replace(re, ''); // Step 2. Create the FOR loop var len = str.length; // var len = "A man, a plan, a canal. Panama".length = 30 for (var i = 0; i < len/2; i++) { if (str[i] !== str[len - 1 - i]) { // As long as the characters from each part match, the FOR loop will go on return false; // When the characters don't match anymore, false is returned and we exit the FOR loop } /* Here len/2 = 15 For each iteration: i = ? i  if("a" !== "a")? // false 2nd iteration: 1 yes 2 if(str[1] !== str[15 - 1 - 1])? => if("m" !== "m")? // false 3rd iteration: 2 yes 3 if(str[2] !== str[15 - 1 - 2])? => if("a" !== "a")? // false 4th iteration: 3 yes 4 if(str[3] !== str[15 - 1 - 3])? => if("n" !== "n")? // false 5th iteration: 4 yes 5 if(str[4] !== str[15 - 1 - 4])? => if("a" !== "a")? // false 6th iteration: 5 yes 6 if(str[5] !== str[15 - 1 - 5])? => if("p" !== "p")? // false 7th iteration: 6 yes 7 if(str[6] !== str[15 - 1 - 6])? => if("l" !== "l")? // false 8th iteration: 7 yes 8 if(str[7] !== str[15 - 1 - 7])? => if("a" !== "a")? // false 9th iteration: 8 yes 9 if(str[8] !== str[15 - 1 - 8])? => if("n" !== "n")? // false 10th iteration: 9 yes 10 if(str[9] !== str[15 - 1 - 9])? => if("a" !== "a")? // false 11th iteration: 10 yes 11 if(str[10] !== str[15 - 1 - 10])? => if("c" !== "c")? // false 12th iteration: 11 yes 12 if(str[11] !== str[15 - 1 - 11])? => if("a" !== "a")? // false 13th iteration: 12 yes 13 if(str[12] !== str[15 - 1 - 12])? => if("n" !== "n")? // false 14th iteration: 13 yes 14 if(str[13] !== str[15 - 1 - 13])? => if("a" !== "a")? // false 15th iteration: 14 yes 15 if(str[14] !== str[15 - 1 - 14])? => if("l" !== "l")? // false 16th iteration: 15 no End of the FOR Loop*/ } return true; // Both parts are strictly equal, it returns true => The string is a palindrome } palindrome("A man, a plan, a canal. Panama");

Bez komentara:

function palindrome(str) { var re = /[^A-Za-z0-9]/g; str = str.toLowerCase().replace(re, ''); var len = str.length; for (var i = 0; i < len/2; i++) { if (str[i] !== str[len - 1 - i]) { return false; } } return true; } palindrome("A man, a plan, a canal. Panama");

Nadam se da vam je ovo pomoglo. Ovo je dio moje serije članaka "Kako riješiti FCC algoritme" o izazovima Algoritma slobodnog koda, gdje predlažem nekoliko rješenja i korak po korak objašnjavam što se događa ispod haube.

Dva načina za potvrđivanje završetka niza u JavaScript-u

U ovom ću članku objasniti kako riješiti izazov "Potvrdi završetak" freeCodeCampa.

Tri načina za preokret niza u JavaScript-u

Ovaj se članak temelji na skripti skripta algoritma Free Code Camp "Obrni niz"

Tri načina za faktorizaciju broja u JavaScript-u

Ovaj se članak temelji na skripti za osnovni algoritam Free Code Camp “Faktorizacija broja”

Tri načina za pronalaženje najduže riječi u nizu u JavaScript-u

Ovaj se članak temelji na skripti za osnovni algoritam Free Code Camp “Pronađi najdužu riječ u nizu”.

Tri načina naslova rečenice u JavaScript-u

This article is based on Free Code Camp Basic Algorithm Scripting “Title Case a Sentence”.

Three ways you can find the largest number in an array using JavaScript

In this article, I’m going to explain how to solve Free Code Camp’s “Return Largest Numbers in Arrays” challenge. This…

If you have your own solution or any suggestions, share them below in the comments.

Or you can follow me on Medium, Twitter, Github and LinkedIn, right after you click the green heart below ;-)

‪#‎StayCurious‬, ‪#‎KeepOnHacking‬ & ‪#‎MakeItHappen‬!

Resources

  • Regular Expressions — MDN
  • toLowerCase() method — MDN
  • replace() — MDN
  • split() method — MDN
  • reverse() method — MDN
  • join() method — MDN
  • String.length — MDN
  • for — MDN