序言:早上起來,按照昨天的計划,看數據結構,上課期間沒學習好,這不去公司培訓了,發現其重要性,趁做畢業設計的時間好好的學習一些基礎知識。
不得不說的是對於軟件的童鞋來說,基礎仍然是重要的。
不多說,進入正題,在看數據結構遇到的一個問題,其問題是:
判斷一個字符串中圓括號是否平衡並喬好匹配。
我的思路:當我遇到一個問題的時候,我就開始分析這個問題,深入了解這個問題,常做的事就是在紙上畫畫寫寫。
1.要知道左右括號要匹配必須左括號的個數是等於右括號個數,這就是解決該問題的算法。
2.要判斷一個字符串中括號是否匹配那就得讀取每一個字符串,得使用到js中的String對象中的一個方法charAt(i)。
3.通過循環讀取字符串中的每一個字符,判斷字符是左括號,則leftNum++;如果是右括號,則leftNum--。
4.最后通過leftNum是否為零來判斷左右括號是否平等。
以下是我使用js實現的代碼:
// isBracketBalance(str)函數是一個用於判斷字符串中括號是否平衡匹配的函數 // @prarmeter: str是將要被判斷的字符串 // 如果匹配返回true // 如果不匹配則返回false function isBracketBalance(str) { var leftBracketNum = 0, // 用於保存左括號個數的變量 strLength = str.length; // 把字符串的長度付給一個變量增加程序的性能 // 通過for循環來讀取字符串中的一個一個的字符 for(var i = 0; i < strLength; i++) { var temp = str.charAt(i); // 付給臨時變量增加程序的性能 if(temp === '(') // 如果是左括號,則leftBracketNum++ { leftBracketNum++; } if(temp === ')') // 如果是右括號,則leftBracketNum-- { leftBracketNum--; } } // 最后判斷leftBracketNum,如果為0表示平衡否則不平衡 if(leftBracketNum === 0) { return true; }else{ return false; } }
當寫完以上代碼后,我想做做測試,不得不人工的寫個字符串來測試,這很麻煩,我就想到自動化(我也是剛學,也不知這是不是自動化)
思路:使用js的隨機函數,從而隨機的取左括號或者右括號,拼湊成一個字符串,調用isBracketBalance(str)函數。
以下是我使用js寫的自動化測試isBracketBalance(str)的代碼:
// 自動化測試 // 寫一個隨機的只包括括號的字符串 // 其個數也是隨機的,自動化測試100遍 // 打印出測試過程中不匹配的字符串 function autoTest() { var errorNum = 0; // 用於保存錯誤個數 // 自動化測試100遍 for(var i = 0; i < 100; i++) { var len = Math.floor(Math.random()*100), // 字符串取0~100之間的任意長度 str = []; // 用於保存隨機取得的括號,最后作為測試的對象 // for循環取括號的隨機值 for(var j = 0; j < len; j++) { if(Math.floor((Math.random()*100)) % 2 == 0) { str.push('('); }else{ str.push(')'); } } str = str.join(''); if(isBracketBalance(str) == false) { console.log(str); errorNum++; } } console.log(errorNum); }
遇到的問題:autoTest()局限性,測試的數量是有限的,測試為什么絕大多數是false。
測試的打印結果:
感悟:每天使用自己熟練的program language去解決一個問題,我覺得這是編程提升的一個方法。深入的挖掘將是更進一步的提升。我發現c++能做更多的事,能更方便的做事,這使得我更加的想多學學c++知識。