簡體   English   中英

在數組(JS)中查找第一個唯一的非七字串

[英]Find the first Unique Non-anagram strings in array (JS)

我試圖在忽略所有其他字謎的情況下找到數組中的第一個唯一字符串,例如:

讓單詞= ['小睡','老師','騙子','鍋','耳朵','時代','公頃'];

輸出=小睡老師的耳朵

或讓單詞= ['rat','tar','art'];

輸出老鼠

我困在這里

let set = new Set();
let words = let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares']


let map = new Map();
for (let word of words) {
    let sorted = word.toLowerCase().split('').sort().join(''); 
    map.set(sorted, word);
    set.add(sorted)
}
let arr = Array.from(set)


for (let inx = 0; inx < words.length; inx++) {
    arr.push('0')
}
console.log(arr);
console.log(words);

function isAnagram(s1, s2){
    return s1.split("").sort().join("") === s2.split("").sort().join("");
  }

let result = [];

  for (let i = 0; i < words.length; i++) {
       if ()
       result.push(words[i])

}
console.log(result);

代替的Mapstring: string在其中只存儲最后字謎選項,您可以創建地圖的string: [ string ]您在其中存儲的所有選項。

然后,最后,您可以遍歷所有這些條目並返回每個數組的第一個元素:

 let set = new Set(); let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares'] let map = new Map(); for (let word of words) { let sorted = word.toLowerCase().split('').sort().join(''); if (!map.has(sorted)) map.set(sorted, []); set.add(sorted); map.get(sorted).push(word); } let arr = Array .from(set) .map(k => map.get(k)[0]) console.log(arr); 

您需要檢查數組“ words”的當前位置,然后檢查其他位置,這意味着您需要在一個循環內有一個循環,因此您的代碼應如下所示:

 let set = new Set(); let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares'] let map = new Map(); for (let word of words) { let sorted = word.toLowerCase().split('').sort().join(''); map.set(sorted, word); set.add(sorted) } let arr = Array.from(set) for (let inx = 0; inx < words.length; inx++) { arr.push('0') } console.log(arr); console.log(words); function isAnagram(s1, s2){ console.log("checking: " + s1 + " and " + s2); return s1.split("").sort().join("") === s2.split("").sort().join(""); } let result = []; let anagram = false; for (let i = 0; i < words.length; i++) { for(let j=i+1; j<words.length; j++){ if (isAnagram(words[i], words[j])){ anagram = true; break; console.log("Is anagram!"); } } if(anagram) { //Before insert we will see if we have an anagram in the result array anagram = false; for(let z=0; z<result.length; z++) { //We will se if it exists in result if(isAnagram(words[i],result[z])) { anagram = true; break; } } if(!anagram) { result.push(words[i]); anagram = false; } } } console.log(result); 

多虧了user3297291,我發現了更簡單的變體

let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares']
const set = new Set();
const unique = [];

words.forEach((word) => {

 const sorted = word.split('').sort().join('');

 if (set.has(sorted)) {
   return;
 }
   unique.push(word);
   set.add(sorted);
 });

 print(unique.join(' '));

另一個實現。 :)

function aClean(arr) {
     var map = new Map();
     arr.map(item => {
         var key = item.toLowerCase().split("").sort().join("");
         map.has(key) ? null : map.set(key, item)
     });
    return Array.from(map.values());
}

這應該做的工作:

let words = ['nap', 'teachers', 'cheaters', 'pan', 'ear', 'era', 'hectares']

let map = new Map(
    words.reverse().map(word => {
        let sorted = word.toLowerCase().split('').sort().join(''); 
        return [sorted, word];
    })
);

console.log(Array.from(map.values())); // output: [ "teachers", "ear", "nap" ]

使用每個單詞的字符作為鍵。 例如:對於[老師,作弊者,公頃],關鍵是“ aceehrst”

並且由於順序對於找到第一個順序很重要,因此顛倒單詞順序將有助於保持“老師”作為鍵“ aceehrst”而不是“公頃”的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM