做者:ManfredHu
連接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/
聲明:版權全部,轉載請保留本段信息,不然請不要轉載javascript
幾道以爲挺有意思的編程題,感受作下來,本身對一些新方法的見解有了新的變化。
好比indexOf
,reduce
,Array.isArray
,forEach
這些方法,之前一看到兼容性是IE9+就有點懼怕,項目中不敢用,致使後面愈來愈陌生,不過如今一想的話。其實只要用Polyfill或者提早fix掉就能夠了。^_^
並且隨着瀏覽器的更新迭代,這些方法確定會得到更多的支持。java
ps:但願新手更要多用這些方法,在特別是學平常學習訓練的時候c++
更新:參加騰訊筆試的編程題,以爲挺有意思的,補上,不過惋惜選擇語言的時候沒有JavaScript
。鬱悶了很久-_-!!正則表達式
var arr = ["apple","orange","apple","orange","pear","orange"];
function getWordCnt(){
//如下應掏空
return arr.reduce(function(prev,next,index,arr){
prev[next] = (prev[next] + 1) || 1; //這句是重點,剛開始都是undefined的時候undefined+1會是NaN
return prev;
},{});
}
console.log(getWordCnt());
注意:這裏傳入了{}
做爲初始參數,因此第一個prev
會是一個空對象,因此第一次的prev[next]
會是undefined
,而這裏用了賦值編程
function containsRepeatingLetter(str) {
//如下應掏空
return /([a-zA-Z])\1/.test(str); // \1指代第一個括號的匹配項
}
在正則表達式中,利用()進行分組,使用斜槓加數字表示引用,\1就是引用第一個分組,\2就是引用第二個分組。將[a-zA-Z]作爲一個分組,而後引用,就能夠判斷是否有連續重複的字母。數組
須要補全的代碼瀏覽器
var fn = function(a, b, c) {
return a + b + c
};
curryIt(fn)(1)(2)(3); //6
function curryIt(fn) {
//這裏補充
}
能夠試着玩一下,這裏是用的函數的柯里化app
var fn = function(a, b, c) {
return a + b + c
};
console.log(curryIt(fn)(1)(2)(3)); //6
function curryIt(fn) {
//如下應掏空
if(typeof fn !== 'function') throw new Error("curryIt():fn must be function");
var len = fn.length; //獲取函數形參數量
var slice = Array.prototype.slice;
var arg = slice.call(arguments, 1);
return function() {
arg = arg.concat(slice.call(arguments));
if(arg.length < len) { //當等於函數須要的形參數量時候調用
return arguments.callee;
}else{
return fn.apply(null,arg);
}
}
}
做爲一種經常使用的數學數列,是由1開始的天然數一次排列成的一個N*N的正方形矩陣,數字一次由外而內的遞增,以下面實例:函數
n=3的蛇形矩陣
1 2 3
8 9 4
7 6 5
n=6的蛇形矩陣
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
此題要求輸入蛇形矩陣寬度N,輸出整個蛇形矩陣結果,注意輸出格式要求按照矩陣從上至下的依次按行輸出,每行中間無需換行輸出。
樣本輸入: 3
樣本輸出: 1 2 3 8 9 4 7 6 5
本身寫的答案(歡迎補充)^_^學習
//能夠把代碼複製到Chrome控制檯運行
;
(function() {
function fixIsArray() {
if (!Array.isArray) {
Array.isArray = function(arr) {
return Object.prototype.toString.call(arr).slice(8, -1) === "Array";
}
}
}
fixIsArray(); //fix Array.isArray(Array.isArray在IE9+支持)
function Arr2D(d) {
if (typeof d !== 'number') throw new Error('Arr2D():arguments d must be number');
this.d = d;
this.arr = this.init2DArr(d);
}
Arr2D.prototype.reat2DArr = function() {
var c = 0, //環數
i = 0, //行
j = 0, //列
out = 1, //總數
z,
n = this.d,
a = this.arr;
//檢驗參數
if (!Array.isArray(a)) throw new Error('reat2DArr():arguments a must be Array');
if (typeof n !== 'number') throw new Error('reat2DArr():arguments n must be Number');
z = n * n;
while (out <= z) {
i = 0; /*每輪後初始化下i,j*/
j = 0;
for (i += c, j += c; j < n - c; j++) {
if (out > z) break;
a[i][j] = out++;
}
for (j--, i = i + 1; i < n - c; i++) {
if (out > z) break;
a[i][j] = out++;
}
for (i--, j = j - 1; j >= c; j--) {
if (out > z) break;
a[i][j] = out++;
}
for (j++, i = i - 1; i > c; i--) {
if (out > z) break;
a[i][j] = out++;
}
c++;
}
return this;
};
Arr2D.prototype.printArr = function() {
var a = this.arr,
n = this.d,
lineStr;
if (!Array.isArray(a)) throw new Error('printArr():arguments a must be Array');
for (i = 0; i < n; i++) {
lineStr = "";
for (j = 0; j < n; j++) {
lineStr += ' ' + a[i][j];
}
console.log(lineStr);
}
return this;
};
//初始化二維矩形數組
Arr2D.prototype.init2DArr = function(m) {
var arr = [],
i, j;
for (i = 0; i < m; i++) {
arr[i] = [];
for (j = 0; j < m; j++) {
arr[i][j] = 0;
}
}
return arr;
};
//調用函數,測試數據數據爲3
var arr = new Arr2D(3);
arr.reat2DArr().printArr();
})();
所謂迴文字符串,就是一個字符串,從左到右和從右到左讀是徹底同樣的。好比」aba」、」c」。
對於一個字符串,能夠經過刪除某些字符而變成迴文字符串,如」cabebaf」,刪除’c’,’e’,’f’後
剩下子串’abba’就是迴文字符串。
要求,給定任意一個字符串,字符串最大長度1000,計算出最長的迴文字符串長度。
如’cabebaf’的迴文字符串包括’c’,’aba’,’abba’等,最長迴文」abba」長度爲4。
輸入:字符串
輸出:最大的迴文字符串長度。
示例:
輸入:cabbeaf
輸出:4
問題:我的是以爲上面這道題的描述是有問題的,好比
cabebaf
,那麼abeba
算不算迴文?一般應該是算的。可是按照題目的意思則是abba
纔算迴文,abeba
是不算的。
並且這裏有干擾項,輸入示例的cabbeaf
中,要刪除字符e
才能檢測出迴文abba
。因此這跟普通的迴文判斷徹底不同。
普通的估計用這樣的方法就能判斷了
//判斷如abba,abeba這樣的字符串
function testArr(str) {
//將字符串切割爲字符數組,倒序反轉再判斷跟原來的字符串是否同樣
return str.split('').reverse().join('') === str;
}
可是這裏不是普通的題目,因此剛開始我想的是用indexOf
和lastIndexOf
來作,經過字符串的逐漸縮小範圍,indexOf
和lastIndexOf
又能夠避免要刪除字符e的尷尬。
;
(function() {
//輸入:cabbeaf
//4
String.prototype.roundWord = function() {
var i = 0,
str = this,
count = 0, //迴文計數
left, right = str.length - 1,
max = 0,
flag = false;
if (str.length <= 0) throw new Error("roundWord(): arguments str/this must be string");
while (i < str.length) {
charOne = str.charAt(i);
left = str.indexOf(charOne, i);
if (!flag) {
right = str.lastIndexOf(charOne);
} else {
right = str.lastIndexOf(charOne, right);
}
if (left !== right && left < right) { //頭尾有相同字符
if (++count >= max) max = count;
flag = true; //開始有迴文
}
i++;
}
return count*2;
};
var str = "cababeacf123";
console.log(str.roundWord()); //6
str = "cabbeaf";
console.log(str.roundWord()); //4
})();