斐波那契數列
function Fibonacci1(n) {
if (n === 1) {
return 1
}
if (n === 2) {
return 1
}
if (n > 2) {
return Fibonacci1(n - 1) + Fibonacci1(n - 2)
}
}
function Fibonacci2(n) {
if (n === 1 || n === 2) {
return 1
} else {
var pre = 1
var next = 1
var target
for (var i = 3; i <= n; i++) {
target = pre + next
pre = next
next = target
}
return target
}
}
var start = new Date().getTime()
console.log(Fibonacci1(30))
var end = new Date().getTime()
console.log(end - start)
start = new Date().getTime()
console.log(Fibonacci2(30))
end = new Date().getTime()
console.log(end - start)
複製程式碼
- 上述寫了實現斐波那契數列的兩種方法,第一種方法用了
遞迴
;第二種方法用了迴圈賦值
;通過上述實踐,可以看出第二種方式的時間空間複雜度很小很小
。所以,在此推薦用第二種方法
實現斐波那契數列
字串反轉
var strChar = 'wangsuoling'
function strReserve1 (str) {
if (typeof str !== 'string') {
return false
} else {
var result = ''
for (var i = str.length - 1; i >= 0 ; i--) {
result += str[i]
}
return result
}
}
function strReserve2 (str) {
if (typeof str !== 'string') {
return false
} else {
let strNew = str.split('').reverse().join('')
return strNew
}
}
var start = new Date().getTime()
console.log(strReserve1(strChar))
var end = new Date().getTime()
console.log(end - start)
start = new Date().getTime()
console.log(strReserve2(strChar))
end = new Date().getTime()
console.log(end - start)
複製程式碼
- 上述寫了實現字串反轉的兩種方法,通過上述實踐,可以看出
第二種方式的時間空間複雜度很小很小
。所以,在此推薦用第二種方法
實現字串反轉
判斷字串是否是迴文
var str1 = 'abeffeba'
var str2 = 'abcdcba'
var str3 = 'abcd1234'
function huiWen1 (str) {
for (let i = 0; i < str.length; i++) {
if (str[i] === str[str.length - 1 - i]) {
return true
} else {
return false
}
}
}
function huiWen2 (str) {
var stackNewArr = [], len, mid, next, top
len = str.length
mid = Math.floor(len / 2 - 1)
top = 0
for (var i = 0; i <= mid; i++) {
stackNewArr[++top] = str[i]
}
if (len % 2 === 0) {
next = mid + 1
} else {
next = mid + 2
}
for (var j = next; j <= len-1; j++) {
if (str[j] !== stackNewArr[top]) {
break
}
top--
}
if (top === 0) {
return true
} else {
return false
}
}
function huiWen3 (str) {
let strNew = str.split('').reverse().join('')
if (strNew === str) {
return true
} else {
return false
}
}
var start = new Date().getTime()
console.log(huiWen1(str2))
var end = new Date().getTime()
console.log(end - start)
start = new Date().getTime()
console.log(huiWen2(str2))
end = new Date().getTime()
console.log(end - start)
start = new Date().getTime()
console.log(huiWen3(str2))
end = new Date().getTime()
console.log(end - start)
複製程式碼
- 上述寫了實現判斷字串是否是迴文的三種方法,通過上述實踐,可以看出
第二種方式 和 第三種方式 的時間空間複雜度很小很小
。所以,在此推薦用第二種方法 或者 第三種方法
實現字串反轉
陣列去重
function unique(arr){
var temp = [];
var len = arr.length;
for(var i = 0; i < len; i++){
if(temp.indexOf(arr[i]) === -1) temp.push(arr[i]);
}
return temp;
}
function unique( arr ) {
var temp = [];
var len = arr.length;
for (var i = 0; i < len; i++) {
var isRepeated = false;
for ( var j = 0; j < temp.length; j++){
if ( arr[i] === temp[j] ){
isRepeated = true;
break;
}
}
if ( !isRepeated ) temp.push( arr[i] );
}
return temp;
}
function unique(arr){
var temp = [];
var len = arr.length;
for (var i = 0; i <len; i++){
if(arr.indexOf([arr[i]) === i) temp.push(arr[i]);
}
return temp;
}
function unique(arr){
var tempObj = {};
var tempArr = [];
var len = arr.length;
for (var i = 0; i < len; i++) {
if ( !tempObj[arr[i]] ){
tempObj[arr[i]] = true;
tempArr.push(arr[i]);
}
}
return tempArr;
}
function unique( arr ) {
var temp = [];
var len = arr.length;
arr.sort();
temp.push(arr[0]);
for ( var i = 1; i < len; i++ ) {
if ( arr[i] !== temp[temp.length-1] ) temp.push(arr[i]);
}
return temp;
}
複製程式碼
二分查詢
var find = function (arr, ele) {
var start = 0;
var end = arr.length - 1;
while (end - start > 1){
var mid = parseInt((end + start) / 2);
if(arr[mid] == ele){
return true;
} else if (arr[mid] > ele){
end = mid - 1;
} else {
start = mid + 1;
}
}
if(end - start == 1){
if((arr[end] == ele) || (arr[start] == ele)){
return true;
}
}
return false;
}
var arr = [1, 3, 5, 6, 7, 9, 11]
var ele = 3
console.log(find(arr, ele))
複製程式碼