#2 javascript算法2

1.用字符串代表數(shù)字來進行算術(shù)操作

描述:

// 比如
seven( times( five() ) ); // 相當(dāng)于 7 * 5 = 35
four( plus( nine() ) ); // 4 + 9 = 13
eight( minus( three() ) ); // 8 - 3 = 5
six( dividedBy( two() ) ); // 6 / 3 = 2

看到這個第一眼就有點蒙逼付材,這肯定要使用高階函數(shù)來完成,但如何實現(xiàn)渣刷,內(nèi)心比較矛盾苗桂,最后看了一下別人的算法:

算法1:

["zero", "one", "two", "three", "four", "five", "six", 
     "seven", "eight", "nine"].forEach(function (name, n) {
            this[name] = function(f) {return f ? f(n) : n}
          });

var plus = n =>
   a =>
     a + n;
var minus = n =>
   a =>
     a - n;
var times = n =>
   a =>
     a * n;
var minus = n =>
   a =>
     a / n;

解析:

首先forEach函數(shù)利用0-9對應(yīng)的索引返回一個函數(shù),
如果這個函數(shù)參數(shù)存在則調(diào)用f(n), 如果不存在則直接
等于索引值趴泌,即0對應(yīng)的是0逆屡,9對應(yīng)的是9;

然后就是加減乘除各自也是一個高階函數(shù)踱讨。

算法2:與上面類似

const numbers = 'zero one two three four five six seven eight nine'.split(' ')

const number = num => {
  return operator => {
    if (operator) return operator(num)
    return num
  }
}

const operator = op => {
  return x => {
    return y => {
      return op(y, x)
    }
  }
}

// Numbers
numbers.forEach((name, index) => 
  GLOBAL[name] = number(index)
)

// Operators
const plus = operator((x, y) => x + y)
const minus = operator((x, y) => x - y)
const times = operator((x, y) => x * y)
const dividedBy = operator((x, y) => x / y)

2.算出一個字符串中重復(fù)的字符個數(shù)(忽略大小寫)

描述:

"abcde" -> 0 # no characters repeats more than once
"aabbcde" -> 2 # 'a' and 'b'
"aabbcdeB" -> 2 # 'a' and 'b'
"indivisibility" -> 1 # 'i'
"Indivisibilities" -> 2 # 'i' and 's'

我的算法:

function duplicateCount(text) {
 var result = [];
 var finalResult = [];
 // 將text中重復(fù)的字符添加到result中
 text.toLowerCase().split("")
  .filter((v, idx, arr) =>
    if (arr.indexOf(v) !== arr.lastIndexOf(v)) {
      result.push(v);
    }
  )
 // 將result中重復(fù)的字符去掉
 finalResult = result.filter((v, idx, arr) =>
          arr.indexOf(v) === idx
 );
 return finalResult.length;
}

我的算法雖然可行,但是比較啰嗦砍的。別人的算法痹筛,利用正則:

function duplicateCount(text) {
  return (
    text
     .toLowerCase().split("").sort().join("")
     .match(/([^])\1+/g || []).length;
 )
}

// 先講字符串全變?yōu)樾懭缓笞優(yōu)閿?shù)組,并且排序
// 然后再將字符按照從小到大組合成字符串
// 正則
// ([^]): 表示任意字符
// (..)\1: 表示前面()的組
// (..)\1+: 表示連著出現(xiàn)2次以及2次以上的

3.將字符串交替的變換大小寫

描述:

toWeirdCase( "String" );//=> returns "StRiNg"
toWeirdCase( "Weird string case" );
//=> returns "WeIrD StRiNg CaSe"

做了半天沒做出來廓鞠,當(dāng)需要多層嵌套時對數(shù)組操作時帚稠, 最好不要用箭頭函數(shù)

別人的:

function toWeirdCase(string) {
  return string.split(/\s+/).map(function(word) {
    return word.split("").map(function(letter, i) {
      return (i % 2 === 0) ? letter.toUpperCase() : letter.toLowerCase()
     // 或者
     // return letter[(!(i%2))?"toUpperCase":"toLowerCase"]()
     // 這種表示方法利用對象的特性
    }).join("");
  }).join(" ");
}

本質(zhì)上是高階函數(shù)的運用, 需要注意的是床佳, 當(dāng)我們使用map之后滋早,如果需要對內(nèi)部item,再進行一次map, 這個時候需要返回一個函數(shù)砌们, 在返回的函數(shù)中對map進行操作杆麸。

解析:

string.split(/\s+/)
//1. 將字符串出去空格變?yōu)閿?shù)組
// "hello world this" => ["hello", "world", "this"]

string.split(/s+/).map(function(word) {
 // ...
})
// 2.對每個單詞進行操作

// 3.這時候需要對每個單詞再一次進行map操作
return word.split(""){} 
// 拆成數(shù)組 
// ["h", "e", "l", "l", "o"]
// 內(nèi)部邏輯處理之后合并成一個單詞返回
// ["HeLlO", "WoRlD", "ThIs"]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搁进,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昔头,更是在濱河造成了極大的恐慌饼问,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揭斧,死亡現(xiàn)場離奇詭異莱革,居然都是意外死亡,警方通過查閱死者的電腦和手機讹开,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門盅视,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旦万,你說我怎么就攤上這事闹击。” “怎么了纸型?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵拇砰,是天一觀的道長。 經(jīng)常有香客問我狰腌,道長除破,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任琼腔,我火速辦了婚禮瑰枫,結(jié)果婚禮上衰粹,老公的妹妹穿的比我還像新娘利虫。我一直安慰自己,他們只是感情好忽孽,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布甥材。 她就那樣靜靜地躺著盯另,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洲赵。 梳的紋絲不亂的頭發(fā)上鸳惯,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音叠萍,去河邊找鬼芝发。 笑死,一個胖子當(dāng)著我的面吹牛苛谷,可吹牛的內(nèi)容都是我干的辅鲸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼腹殿,長吁一口氣:“原來是場噩夢啊……” “哼独悴!你這毒婦竟也來了例书?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤绵患,失蹤者是張志新(化名)和其女友劉穎雾叭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體落蝙,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡织狐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筏勒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片移迫。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖管行,靈堂內(nèi)的尸體忽然破棺而出厨埋,到底是詐尸還是另有隱情,我是刑警寧澤捐顷,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布荡陷,位于F島的核電站,受9級特大地震影響迅涮,放射性物質(zhì)發(fā)生泄漏废赞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一叮姑、第九天 我趴在偏房一處隱蔽的房頂上張望唉地。 院中可真熱鬧,春花似錦传透、人聲如沸耘沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽群嗤。三九已至,卻和暖如春兵琳,著一層夾襖步出監(jiān)牢的瞬間骚烧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工闰围, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人既峡。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓羡榴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親运敢。 傳聞我的和親對象是個殘疾皇子校仑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容