题目描述

继MIUI8推出手机分身功能,MIUI计划推出一个电话号码分身得功能:首先将电话号码中的每个数字加上8取个位,然后使用对应得大写字母代替 ("ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"), 然后随机打乱这些字母,所生成得字符串即为电话号码对应得分身。

例子:

输入 => 输出

EIGHT => 0

ZEROTWOONE => 234

OHWETENRTEO => 345

OHEWTIEGTHENRTEO => 0345

这道题是输入一个字符串,映射到一个数字串。

映射题我的习惯是先尝试用字典的方式做,那么接下来开始做这道题:

10个数字与其英文单词一一对应,那么这些词能不能做些文章呢?

我们可以发现,在这十个数字的英文单词中,字符 Z 只存在于 ZERO,W 只存在于 TWO,以此类推。

所以现在一旦在字符串中发现 Z,我们就可以说存在 0。

我们在这里把 Z 称作 特征字符, ZERO 称作 字符值, 0 称为 数字值

那么,我们可以得到一组映射:

{

Z: ['ZERO', 0],

W: ['TWO', 2],

U: ['FOUR', 4],

X: ['SIX', 6],

G: ['EIGHT', 8]

}

因此0, 2, 4, 6, 8已经处理好了,现在还剩下 1, 3, 5, 7, 9。

仔细分析可以发现,字符O在这五个数字的英文中,只存在于ONE;字符F只存在于FIVE中,以此类推。

那么,我们又可以得到一组映射:

{

O: ['ONE', 1],

T: ['THREE', 3],

F: ['FIVE', 5],

S: ['SEVEN', 7]

}

为什么这里没有9的映射呢?因为 NINE中N, I, E在 1, 3, 5, 7中都有出现,这里我们就先空着。

注意

这里的两个映射关系是不可以合并的,想想为什么?

那么这些映射关系有什么用呢?这里就要用到字典(dict)啦。

我们可以把输入的字符串,转换为一个字典结构,key 是字符, value 是这个字符在整个字符串中出现的次数。

例如:

"OHEWTIEGTHENRTEO"

var dict = {

E: 4,

T: 3,

O: 2,

H: 2,

I: 1,

G: 1,

W: 1,

N: 1,

R: 1

}

然后我们遍历这个字典:

[{

Z: ['ZERO', 0],

W: ['TWO', 2],

U: ['FOUR', 4],

X: ['SIX', 6],

G: ['EIGHT', 8]

},{

O: ['ONE', 1],

T: ['THREE', 3],

F: ['FIVE', 5],

S: ['SEVEN', 7]

}].map(map => {

Object.keys(dict).map(key => {

/** 检查当前字符是否在映射表中

* 在的话检查字典中当前字符的数量是否仍然大于0

*/

map[key] && dict[key] > 0 &&

/**

* 把映射关系中的字面值取出并拆解为一个字符数组,

* 遍历这个字符数组,将字典中该字符的计数减去1,即消化了这个字面值

*/

map[key][0].split('').map(char => dict[char] -= 1) &&

// 把消化的数字值打出来

console.log(map[key][1])

})

})

/**

* 2

* 8

* 1

* 3

*/

可是题目说明 OHEWTIEGTHENRTEO 的输出值应该是 0345呀,哪里出错了呢?

注意题目中的一句话

首先将电话号码中的每个数字加上8取个位

也就是说,我们打出来的值还需要对这个 加8取个位 进行逆向。

有几种方法,一是在打印时对 map[key][1] 进行处理:

num => num - 8 >= 0 ? num - 8 : num + 2

或者,我这里用了偷懒的办法,还记得我们映射表中有个数字值吗?我人工替换了 :P

[{

Z: ['ZERO', 2],

W: ['TWO', 4],

U: ['FOUR', 6],

X: ['SIX', 8],

G: ['EIGHT', 0]

},{

O: ['ONE', 3],

T: ['THREE', 5],

F: ['FIVE', 7],

S: ['SEVEN', 9

}].map(map => {

Object.keys(dict).map(key => {

map[key] && dict[key] > 0 &&

map[key][0].split('').map(char => dict[char] -= 1) &&

console.log(map[key][1])

})

})

/**

* 4

* 0

* 3

* 5

*/

那么现在只需要把输出值进行一下正序排序即可:

var output = [];

[{ Z: ['ZERO', 2], W: ['TWO', 4], U: ['FOUR', 6], X: ['SIX', 8], G: ['EIGHT', 0]

},{ O: ['ONE', 3], T: ['THREE', 5], F: ['FIVE', 7], S: ['SEVEN', 9}].map(map => {

Object.keys(dict).map(key => {

map[key] && dict[key] > 0 &&

map[key][0].split('').map(char => dict[char] -= 1) &&

output.push(map[key][1])

})

})

/*

* 还记得我们把 9 的处理留空了吗?现在要补上啦~

* 9 的英文 NINE 你只需要随意检查前边过滤后的字典是否还存在 N I E 任意一个字符即可

* 我选择的是判断 E

* 输入的9对应的输出应该是1,还记得为什么吗?

*/

//if (dict['E'] && dict['E'] > 0) output.push(1)

/**

* 2017.09.19 08:36 更新:

* 之前只判断了是否还存在9,但是忘了多个9同时存在的情况,那么需要做如下改进:

*/

dist['E'] && // 检查是否还存在特征字符 E,在经过前面的映射关系过滤后,还剩下几个E,就还有几个9

(output = output.concat(Array(dist['E']).fill(1))) //纯js技巧,快速生成指定大小的数组并填充一个值

output.sort()

console.log(output) // 0 3 4 5

虽然说本文标题有个 [算法] 前缀,不过这个写法完全没考虑什么复杂度之类的东西 ORZ

java号码分身_[算法] 电话号码分身 (小米2017 秋招真题)[JavaScript]相关推荐

  1. 电话号码分身(小米2017秋招真题)

    电话号码分身(小米2017秋招真题) 题目描述 继MIUI8推出手机分身功能之后,MIUI9计划推出一个电话号码分身的功能:首先将电话号码中的每个数字加上8取个位,然后使用对应的大写字母代替(&quo ...

  2. 树的高度(小米2017秋招真题)

    现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度. 输入 输入的第一行表示节点的个数n(1<=n<=1000,节点的编号为0到n-1)组成, ...

  3. Java面经:小米暑期实习+秋招真题分享

    秋招结束,总结了一下从寒假回来开始的实习生招聘和秋招面经,过来回馈一下牛客网. 上学期寒假回来就开始投简历,找人内推的小米,过几天后约时间面试,部门未知. 一面 1小时7分钟 上来先自我介绍,然后开始 ...

  4. 中gcd函数_算法|博弈论入门(函数讲解+真题模板)

    作者:wxyww 链接:https://ac.nowcoder.com/discuss/183993 来源:牛客网 SG函数 作用 对于一个状态i为先手必胜态当且仅当SG(i)!=0. 转移 那怎么得 ...

  5. 凑数算法 java_[蓝桥杯][2017年第八届真题]包子凑数 (Java代码)

    解题思路: 背包问题,然后需要求最大公约数. 很容易可以理解,当所有笼包子全部为偶数,比如2,4,6,那完了,有无限多种方案. 再看一个例子,当全部为3,6,9的时候,能够推出来嘛?也不能,为什么呢? ...

  6. 【求职】小米 2018 秋招测试开发工程师笔试题

    小米 2018 秋招测试开发工程师笔试题 一.单选题 1.静态变量static 在不同的实例中地址是否一样?他们储存在什么区域?( ) A. 地址一样,在堆栈区. B. 地址不一样,在堆栈区. C. ...

  7. 小米2019秋招系统软件开发笔试题详解

    小米2019秋招系统软件开发笔试题详解 兄弟们,给大家个题目玩一玩,题目如下: @ 在游戏Dota2中,有一位非常强大的英雄卡尔,他有三种属性:冰.火.雷.同时卡尔身上有三个无顺序的属性槽,他可以从三 ...

  8. java dfs算法蓝桥杯题_【蓝桥杯省赛JavaB组真题详解】四平方和(2016)_疼疼蛇的博客-CSDN博客...

    原文作者:疼疼蛇 原文标题:[蓝桥杯省赛JavaB组真题详解]四平方和(2016) 发布时间:2021-02-26 15:00:01 题目描述 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数 ...

  9. abcde依次进入一个队列_数据结构与算法 | 一文掌握队列Queue(真题讲解)

    本系列内容专为课程面向笔/面试的<数据结构与算法>总结性精讲开设,以图文并茂的方式讲解数据结构,让大家打牢基础,促进对课程内容的掌握,最后做到题解大神,大厂offer拿到手软! 目录:一文 ...

最新文章

  1. 使用Python,机器学习和深度学习的5个很棒的计算机视觉项目创意!
  2. 误码率越高越好还是越低越好_夜间护理步骤越多越好还是越少越好?NFF
  3. 闲来没事写个记事本玩玩!!!
  4. 简单工厂抽象工厂工厂方法_让工厂美丽
  5. python zip用法_Python zip()用法及代码示例
  6. Java中OutOfMemoryError(内存溢出)的情况及解决办法
  7. 凸优化第四章凸优化问题 4.1 优化问题
  8. 136_原始套接字_链路层MAC包_模仿他人飞秋,给自己主机上的飞秋【发送UDP数据】【只需要修改包含用户名、头像信息的数组】
  9. 确定权重的方法-主成分分析
  10. mongodb数据的导入导出备份恢复
  11. C4D R23 安装教程
  12. [机缘参悟-6]:阳明心学三大核心思想:心外无物、知行合一、致良知的理解
  13. MySQL查询point类型类型的坐标,返回经度纬度
  14. 求一个数的最大真约数
  15. OpenStack之Nova分析——Nova API服务
  16. PT100转RS485热电阻Modbus低成本数据采集模块
  17. OpenHarmony驱动子系统开发
  18. 区块链可扩展性技术:闪电网络
  19. java常见面试题答案
  20. Uos统信系统本地apt及基础网络,主机名时区配置

热门文章

  1. 在网页中如何定义鼠标的样式
  2. 实现在 .net 中使用 HttpClient 下载文件时显示进度
  3. 【Docker】Docker镜像是什么?浅谈对Docker镜像的理解
  4. 【三大锁】悲观锁——mysql悲观锁
  5. 【squid缓存服务器】
  6. 软件测试的方法一共有几种
  7. 极客时间 自我提升第二天 数据结构与算法之美 应该掌握 / 趣谈网络原理 / 深入浅出计算机组成原理 思维导图
  8. 本地机连接不上虚拟机?
  9. java创建多个线程 延时1秒_Java 多线程(三)优化任务执行
  10. ManiSkill 2022机器学习顶会ICLR上的世界顶尖机械臂大赛官网信息整理