當前位置:編程學習大全網 - 編程語言 - Js基礎算法有哪些

Js基礎算法有哪些

這次給大家帶來Js基礎算法有哪些,使用Js基礎算法的註意事項有哪些,下面就是實戰案例,壹起來看壹下。

素數

Q:妳將如何驗證壹個素數?

A:壹個素數只能被它自己和1整除。所以,我將運行壹個while循環並加1。(看代碼示例,如果妳無法理解,那這不是妳的菜。先回去學習javaScript基礎知識然後再回來吧。)

方法1

function isPrime(n){

var pisor = 2;

while (n > pisor){

if(n % pisor == 0){

return false;

}

else

pisor++;

}

return true;

}

isPrime(137); // = true

isPrime(237); // = falseQ:妳能做得更好嗎?

A:可以。除數壹次增加1個。 在3之後我可以增加2.如果壹個數可以被任何偶數整除,它將被2整除。

補充:如果妳不需要把除數增加到這個數。妳可以更早停止。讓我在下面的步驟中解釋壹下(如果需要可以多讀幾遍)

第壹步,任何數字都不能被大於它的壹半的數字整除。 例如,13將永遠不能被7,8,9整除?它甚至可以是偶數的壹半。 例如,16將被8整除,但永遠不會被9,10,11,12 ?

結論:壹個數字將永遠不能被壹個大於其壹半數值的數字整除。 所以,我們可以少循環50%。

第二步,現在,如果壹個數字不能被3整除。(如果它可被3整除,那麽它就不是質數)。然後,它不可以被大於其值1/3的任何數整除。例如,35不能被3整除。因此,它永遠不會被大於35/3的數整除,永遠不能被12, 13, 14整除?如果妳取壹個像36壹樣的偶數,它將永遠不能被13, 14, 15整除。

結論: 壹個數字可以被其數值的三分之壹整除。

第三步,例如,妳有壹個數字127。127不能被2整除,因此妳最多應該檢查63.5。其次,127不能被3整除。因此,您將檢查到127/3大約42。它不能被5整除,除數應該小於127/5大約25,而不是7。那麽,我們該在哪裏停下來?

結論: 除數將小於math.sqrt(N)

方法2

如果妳不能理解也不用擔心,別管它。如果那妳不是壹個研究人員就沒關系。

function isPrime(n)

{

var pisor = 3,

limit = Math.sqrt(n);

//check simple cases

if (n == 2 || n == 3)

return true;

if (n % 2 == 0)

return false;

while (pisor <= limit)

{

if (n % pisor == 0)

return false;

else

pisor += 2;

}

return true;

}

isPrime(137); // = true

isPrime(237); // = false素數因子

Q:如何求出壹個數的所有素數因子?

A:執行壹個while循環。開始除以2,如果不能整除,記錄這個除數,直到完成。

function primeFactors(n){

var factors = [],

pisor = 2;

while(n>2){

if(n % pisor == 0){

factors.push(pisor);

n= n/ pisor;

}

else{

pisor++;

}

}

return factors;

}

primeFactors(69); // = [3, 23]Q:運行時間復雜度是多少? 妳能做得更好嗎?

A:O(n)。可以將除數從3開始,累加2。因為,如果壹個數被任何偶數整除,它將被2整除。因此,妳不需要除以偶數。此外,妳不會有壹個大於其價值壹半的因素。如果妳想讓它變得復雜,那就用第壹題的補充概念吧。

Fibonacci(斐波那契)

Q:如何獲得第n個斐波納契數字?

A: 我創建壹個數組並從叠代開始。

斐波那契系列是面向初學者的最受歡迎的面試問題之壹。 所以,妳必須學習這壹個。

方法1

function fibonacci(n){

var fibo = [0, 1];

if (n <= 2) return 1;

for (var i = 2; i <=n; i++ ){

fibo[i] = fibo[i-1]+fibo[i-2];

}

return fibo[n];

}

fibonacci(12); // = 144Q: 運行時間復雜度是多少?

A: O(n);

Q: 妳能讓它遞歸嗎?

方法2

function fibonacci(n){

if(n < =1) {

return n;

} else {

return fibonacci(n-1) + fibonacci (n-2);

}

}

fibonacci(12); // = 144Q: 運行時間復雜度是多少?

A: O(2n);關於時間復雜度的細節

最大公約數

Q: 妳會如何找到兩個數字的最大公約數?

function greatestCommonpisor(a, b){

var pisor = 2,

greatestpisor = 1;

//if u pass a -ve number this will not work. fix it dude!!

if (a < 2 || b < 2)

return 1;

while(a >= pisor && b >= pisor){

if(a %pisor == 0 && b% pisor ==0){

greatestpisor = pisor;

}

pisor++;

}

return greatestpisor;

}

greatestCommonpisor(14, 21); // 7

greatestCommonpisor(69, 169); // = 1算法範式

很抱歉。我也無法解釋它。 因為我自己80%的情況下都不能理解它。 我的算法分析教練告訴我這個,又從課堂筆記偷走(我是壹個好學生,順便說壹句!)

function greatestCommonpisor(a, b){

if(b == 0)

return a;

else

return greatestCommonpisor(b, a%b);

}註意:用妳的大腦來理解它。

去重

Q:妳將如何從數組中刪除重復的成員?

A: 執行壹個循環,並保存壹個對象/關聯數組。如果我第壹次找到壹個元素,我會設置它的值為真(這將告訴我元素添加壹次)。如果我在對象中找到這個元素,我不會將它插入到返回數組中。

function removeDuplicate(arr){

var exists ={},

outArr = [],

elm;

for(var i =0; i<arr.length; i++){

elm = arr[i];

if(!exists[elm]){

outArr.push(elm);

exists[elm] = true;

}

}

return outArr;

}

removeDuplicate([1,3,3,3,1,5,6,7,8,1]); // = [1, 3, 5, 6, 7, 8]合並兩個排序的數組

Q: 怎樣合並兩個已排序數組?

A: 我將為每個數組保留壹個指針(看代碼,並註意這個)。

function mergeSortedArray(a, b){

var merged = [],

aElm = a[0],

bElm = b[0],

i = 1,

j = 1;

if(a.length ==0)

return b;

if(b.length ==0)

return a;

/*

if aElm or bElm exists we will insert to merged array

(will go inside while loop)

to insert: aElm exists and bElm doesn't exists

or both exists and aElm < bElm

this is the critical part of the example

*/

while(aElm || bElm){

if((aElm && !bElm) || aElm < bElm){

merged.push(aElm);

aElm = a[i++];

}

else {

merged.push(bElm);

bElm = b[j++];

}

}

return merged;

}

mergeSortedArray([2,5,6,9], [1,2,3,29]);// = [1, 2, 2, 3, 5, 6, 9, 29]不通過臨時變量交換兩個數的值

Q:如何在不使用臨時變量的情況下交換兩個數字?

function swapNumb(a, b){

console.log('before swap: ','a: ', a, 'b: ', b);

b = b -a;

a = a+ b;

b = a-b;

console.log('after swap: ','a: ', a, 'b: ', b);

}

swapNumb(2, 3);

// = before swap: a: 2 b: 3

// = after swap: a: 3 b: 2位操作:對不起,我無法向妳解釋這壹點。 Kinjal Dave建議到 logical conjunction理解它。將浪費您30分鐘。

function swapNumb(a, b){

console.log("a: " + a + " and b: " + b);

a = a ^ b;

b = a ^ b;

a = a ^ b;

console.log("a: " + a + " and b: " + b);

}

swapNumb(2, 3);

// = a: 2 and b: 3

// = a: 3 and b: 2字符串反向

Q:如何在JavaScript中反轉字符串?

A:可以遍歷字符串並將字母連接到新字符串。

方法1

function reverse(str){

var rtnStr = '';

for(var i = str.length-1; i>=0;i--){

rtnStr +=str[i];

}

return rtnStr;

}

reverse('you are a nice dude');

// = "edud ecin a era uoy"Q:妳知道在現代瀏覽器中串聯效果很好,但在像IE8這樣的舊瀏覽器中會變慢。 還有什麽不同的方法,可以扭轉壹個字符串?

A:當然.我可以使用數組,也可以添加壹些檢查。如果字符串是NULL或其他字符串,這將失敗。讓我也做壹些類型檢查。使用此數組類似於在某些服務器端語言中使用字符串緩沖區。

方法2

function reverse(str){

var rtnStr = [];

if(!str || typeof str != 'string' || str.length < 2 ) return str;

for(var i = str.length-1; i>=0;i--){

rtnStr.push(str[i]);

}

return rtnStr.join('');

}Q: 運行時間復雜度是多少?

A: O(n);

Q:可以做得更好?

A:我可以遍歷索引的壹半,它會節省壹點點。 (這是沒用的,可能不會打動面試官)

方法3

function reverse(str) {

str = str.split('');

var len = str.length,

halfIndex = Math.floor(len / 2) - 1,

revStr;

for (var i = 0; i <= halfIndex; i++) {

revStr = str[len - i - 1];

str[len - i - 1] = str[i];

str[i] = revStr;

}

return str.join('');

}Q:這有效,但妳可以做遞歸的方式嗎?

A:可以。

方法4

function reverse (str) {

if (str === "") {

return "";

} else {

return reverse(str.substr(1)) + str.charAt(0);

}

}方法5

Q:妳可以在方法中使用任何構建,使它更清潔嗎?

function reverse(str){

if(!str || str.length <2) return str;

return str.split('').reverse().join('');

}方法6

Q:妳可以做反向函數作為字符串擴展嗎?

A:我需要將這個函數添加到String.prototype,而不是使用str作為參數,我需要使用this

String.prototype.reverse = function (){

if(!this || this.length <2) return this;

return this.split('').reverse().join('');

}

'abc'.reverse();

// = 'cba'單詞反轉

Q:妳如何在句子中顛倒單詞?

A:您必須檢查整個字符串的空白區域。確定是否可能有多個空格。

//have a tailing white space

//fix this later

//now i m sleepy

function reverseWords(str){

var rev = [],

wordLen = 0;

for(var i = str.length-1; i>=0; i--){

if(str[i]==' ' || i==0){

rev.push(str.substr(i,wordLen+1));

wordLen = 0;

}

else

wordLen++;

}

return rev.join(' ');

}內置方法的快速解決方案:

function reverseWords(str){

return str.split(' ').reverse();

}原位反轉

Q: 如果妳有壹個字符串如”I am the good boy”, 怎樣變為 “I ma eht doog yob”? 註意這些單詞位置不變但是被反轉了。

A: 要做到這壹點,我必須做字符串反向和字反轉。

function reverseInPlace(str){

return str.split(' ').reverse().join(' ').split('').reverse().join('');

}

reverseInPlace('I am the good boy');// = "I ma eht doog yob"Q: ok。好的,妳能不使用內置反向函數做到嗎?

A: (內心獨白)有沒有搞錯!!

//sum two methods.

//you can simply split words by ' '

//and for each words, call reverse function

//put reverse in a separate function

//if u cant do this,

//have a glass of water, and sleep第壹個非重復字符

Q: 怎麽在字符串中找到第壹個非重復字符?

A: 有什麽條件嗎?

A: 比如是否區分大小寫?

面試官可能會說No。

A: 是長字符串還是短字符串?

Q: 這些有什麽關系嗎?

A:例如,如果它是壹個非常長的字符串,說壹百萬個字符,我想檢查是否有26個英文字符正在重復。 我可能會檢查是否所有字符都在每200個字母中重復(例如),而不是循環遍歷整個字符串。 這將節省計算時間。

Q: 簡單起見, 這個字符串是 “the quick brown fox jumps then quickly blow air”。

function firstNonRepeatChar(str){

var len = str.length,

char,

charCount = {};

for(var i =0; i<len; i++){

char = str[i];

if(charCount[char]){

charCount[char]++;

}

else

charCount[char] = 1;

}

for (var j in charCount){

if (charCount[j]==1)

return j;

}

}

firstNonRepeatChar('the quick brown fox jumps then quickly blow air');// = "f"這有壹個問題,不能再循環中及時退出。

刪除重復的字符

Q: 怎樣刪除字符串中的重復字符?

A: 這與第壹個非重復字符非常相似。妳應該問壹些類似的問題。它是區分大小寫的嗎?。

如果面試官說,這是區分大小寫的,那麽妳就很輕松了。 如果他說不。妳可以使用string.toLowercase()來把字符串。面試官可能不喜歡這個方法。 因為返回字符串不會擁有相同的大小寫。 所以

function removeDuplicateChar(str){

var len = str.length,

char,

charCount = {},

newStr = [];

for(var i =0; i<len; i++){

char = str[i];

if(charCount[char]){

charCount[char]++;

}

else

charCount[char] = 1;

}

for (var j in charCount){

if (charCount[j]==1)

newStr.push(j);

}

return newStr.join('');

}

removeDuplicateChar('Learn more javascript dude'); // = "Lnmojvsciptu"回文檢查

Q: 如何檢查壹個字符串是否是回文?

A: 把字符串反轉,如果反轉前後相等,那麽它就是回文。

function isPalindrome(str){

var i, len = str.length;

for(i =0; i<len/2; i++){

if (str[i]!== str[len -1 -i])

return false;

}

return true;

}

isPalindrome('madam')

// = true

isPalindrome('toyota')

// = false或者

function checkPalindrom(str) {

return str == str.split('').reverse().join('');

}類似的:在 O(n)時間復雜度內判斷壹個字符串是否包含在回文字符串內。妳能在O(1)時間解決問題嗎?

找缺失的數字

Q: 在壹個1到100的未排序數組中找到缺失的數,妳怎麽做?

說明:數組中的數字為1到100。 數組中只有壹個數字缺

  • 上一篇:物流員工試用期工作總結5篇
  • 下一篇:大數據對數學要求高嗎
  • copyright 2024編程學習大全網