题解 | #查找兄弟单词#
查找兄弟单词
https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void async function () { // Write your code here while(line = await readline()){ let tokens = line.split(' '); function equal(a, b) { if (a.length !== b.length) { return false; } for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) { return false; } } return true; } let n = Number(tokens.shift()); let k = Number(tokens.pop()); let x = tokens.pop(); let x_set = x.split('').sort(); let sorted_tokens = []; let m = 0; for (let i = 0; i < n; i++) { let cur_set = tokens[i].split('').sort(); if (equal(cur_set, x_set)) { if (x === tokens[i]) { // same word continue; } m++; //insert_desc(sorted_tokens, tokens[i]); sorted_tokens.push(tokens[i]); // todo 找到第k大 } else { continue; } } console.log(m); if (m < k) return; // not enough for kth for (let i = 0; i < k; i++) { let max_i = i; for (let j = i; j < m; j++) { if (sorted_tokens[max_i].localeCompare(sorted_tokens[j]) == 1) { max_i = j; } } [sorted_tokens[max_i], sorted_tokens[i]] = [sorted_tokens[i], sorted_tokens[max_i]]; } console.log(sorted_tokens[k - 1]); return; } }()
首先明白单词中可能有重复的字母!
判断兄弟单词的方法:将字符数组按字典序排序,如果每个索引位置的字符都相同,就是兄弟单词。同时要注意和原始字符顺序不能相同。
解题过程中,首先截取字符个数n、排序位置k、单词x。
然后遍历tokens,如果是兄弟单词,m加一,并且加入到兄弟单词的数组中;否则跳过。
然后对兄弟单词的数组进行排序,只排序k次就行。
最后输出索引为k-1位置的兄弟单词。