[アルゴリズム]電話番号分身(小米2017秋招真題)[JavaScript]
4375 ワード
テーマの説明
MIUIは携帯電話の分身機能を発表したMIUU 8に続き、電話番号の分身機能を導入する予定だ.まず、電話番号の数字に8桁を付けて、大文字で代替する(「ZERO」、「ONE」、「TWO」、「THREE」、「FOUR」、「FIVE」、「SIX」、「SEVEN」、「EITGHT」、「NINE」の文字をランダムにして混乱させる.生成された文字列は電話番号のペアに分身するべきです.
例:入力=>出力EGHT=>0 ZEROTWOONE=>234 OHWETENRTEO=>345 OHEWT IEGTHERTEO=>0345
この問題は文字列を入力して、数字列にマッピングします.写像問題はまず辞書でやってみる習慣です.
10個の数字は英語の単語と一々対応していますが、これらの単語はいくつかの文章を作ることができますか?
これらの10個の数字の英語単語の中で、文字
ここの二つのマッピング関係は統合できないです.なぜですか?
これらのマッピング関係は何のためにありますか?ここは辞書を使います.入力した文字列を辞書構造に変換してもいいです.
たとえば:
問題の中のひと言に注意します.
まず電話番号の数字に8をつけて、席を取ります.
つまり、私たちが打った値はこの
MIUIは携帯電話の分身機能を発表したMIUU 8に続き、電話番号の分身機能を導入する予定だ.まず、電話番号の数字に8桁を付けて、大文字で代替する(「ZERO」、「ONE」、「TWO」、「THREE」、「FOUR」、「FIVE」、「SIX」、「SEVEN」、「EITGHT」、「NINE」の文字をランダムにして混乱させる.生成された文字列は電話番号のペアに分身するべきです.
例:入力=>出力EGHT=>0 ZEROTWOONE=>234 OHWETENRTEO=>345 OHEWT IEGTHERTEO=>0345
この問題は文字列を入力して、数字列にマッピングします.写像問題はまず辞書でやってみる習慣です.
10個の数字は英語の単語と一々対応していますが、これらの単語はいくつかの文章を作ることができますか?
これらの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
はこの5つの数字の英語ではONE
だけに存在していることが分かります.文字F
はFIVE
にのみ存在し、これに類推する.じゃ、私達はまた一つのマップを得ることができます.
{
O: ['ONE', 1],
T: ['THREE', 3],
F: ['FIVE', 5],
S: ['SEVEN', 7]
}
なぜここに9
のマッピングがないですか?NINE
にN, I, E
が1, 3, 5, 7
に全部出現していますので、ここは空いています.ここの二つのマッピング関係は統合できないです.なぜですか?
これらのマッピング関係は何のためにありますか?ここは辞書を使います.入力した文字列を辞書構造に変換してもいいです.
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
を逆にする必要があります.いくつかの方法があります.1つは、印刷時に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
本文のタイトルには[ ]
プレフィックスがありますが、この書き方は全く複雑さなどを考えていません.