#2 javascript算法2

1.用字符串代表数字来进行算术操作

描述:

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

看到这个第一眼就有点蒙逼,这肯定要使用高阶函数来完成,但如何实现,内心比较矛盾,最后看了一下别人的算法:

算法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函数利用0-9对应的索引返回一个函数,
如果这个函数参数存在则调用f(n), 如果不存在则直接
等于索引值,即0对应的是0,9对应的是9;

然后就是加减乘除各自也是一个高阶函数。

算法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.算出一个字符串中重复的字符个数(忽略大小写)

描述:

"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中重复的字符添加到result中
 text.toLowerCase().split("")
  .filter((v, idx, arr) =>
    if (arr.indexOf(v) !== arr.lastIndexOf(v)) {
      result.push(v);
    }
  )
 // 将result中重复的字符去掉
 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;
 )
}

// 先讲字符串全变为小写然后变为数组,并且排序
// 然后再将字符按照从小到大组合成字符串
// 正则
// ([^]): 表示任意字符
// (..)\1: 表示前面()的组
// (..)\1+: 表示连着出现2次以及2次以上的

3.将字符串交替的变换大小写

描述:

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

做了半天没做出来,当需要多层嵌套时对数组操作时, 最好不要用箭头函数

别人的:

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(" ");
}

本质上是高阶函数的运用, 需要注意的是, 当我们使用map之后,如果需要对内部item,再进行一次map, 这个时候需要返回一个函数, 在返回的函数中对map进行操作

解析:

string.split(/\s+/)
//1. 将字符串出去空格变为数组
// "hello world this" => ["hello", "world", "this"]

string.split(/s+/).map(function(word) {
 // ...
})
// 2.对每个单词进行操作

// 3.这时候需要对每个单词再一次进行map操作
return word.split(""){} 
// 拆成数组 
// ["h", "e", "l", "l", "o"]
// 内部逻辑处理之后合并成一个单词返回
// ["HeLlO", "WoRlD", "ThIs"]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容