簡體   English   中英

Sherlock 和 Valid String 黑客挑戰

[英]Sherlock and Valid String hackerank challenge

我試圖在 Hackerrank 中解決這個特定的挑戰,但我無法通過所有測試用例。 2 是使其成為有效字符串所需的最小刪除次數。 可以通過以下兩種方式完成:

輸入 = aabbcd...

樣本輸出必須是 no....

解釋

刪除 c 和 d 以獲得 aabb。 或者刪除 a 和 b 以獲得 abcd。

這是我的代碼:

function processData(input) {
    //Enter your code here
   var unique = "";
    var counter = 0;
    var different ="";
  for (i = 0; i < input.length; i++) {
    if (input.lastIndexOf(input[i]) == input.indexOf(input[i])) {
      unique += input[i];

    }counter ++;
  var count1 = (input.match(/input[i]/) || []).length;
  }
    if (counter <= 1)
    {
        console.log("YES");
    }
    else if (counter > 1){
        console.log("NO"); 
    }
    //console.log(count1);
    //console.log(unique);
}

你的算法失敗了,因為你的解決方案沒有解決問題。 最后檢查字符串是否可以接受使用計數器

  if (counter <= 1)
    {
        console.log("YES");
    }
    else if (counter > 1){
        console.log("NO"); 
    }

但是,每次 for 循環運行時,計數器都會增加。 這意味着您的解決方案僅通過默認情況下解析為“NO”的測試。

您還創建了一個名為 different 的變量,您從未使用過該變量,並且 unique 和 count1 都被分配了值,但之后從未使用過。

您的算法應檢查每個字符串的頻率,並查看每個字符串的頻率是否相同(或相差最大 1)。您的算法僅檢查字母的唯一性。 我建議使用計算每個字母的出現

input.match(/input[i]/).length;

和比較頻率

這是我的答案。 要記住的要點 1. 確保你修剪其他你的 get 轉義 \\n 作為輸入的一部分。 2. 計算字符的出現次數。 3. 將字符計數映射到它們的出現。 4. 現在檢查出現次數是否為 1 => 有效,否則如果 2 確保您檢查至少一次出現次數為 1 例如:aabbcd c 和 d 出現 2 次且字符計數均為 1,因此他必須同時刪除 c 和d.

注意:未在問題中澄清相同的字符可以被多次刪除,它仍然可以被視為一次刪除,例如:aabbcccc 我有 4 個 c,但我可以使用一個操作來刪除 2 個 C 以使其成為有效的字符串 aabbcc。

var bIsValidString = false;
var oCharMapCount = input.trim().split("").reduce((acc, val) => {
    if (acc[val]) {
        acc[val] += 1;
    }
    else {
        acc[val] = 1;
    }
    return acc;
}, {});
var oCharOccuranceMap = {}; 
for(let key in oCharMapCount) {
    if (oCharOccuranceMap[oCharMapCount[key]]) {
        oCharOccuranceMap[oCharMapCount[key]] += 1;
    }
    else {
        oCharOccuranceMap[oCharMapCount[key]] = 1;
    }
}
var iCharOccurances = (Object.keys(oCharOccuranceMap) || []).length;

if (iCharOccurances === 1) {
    bIsValidString = true;
}
else if (iCharOccurances === 2) {
    for (let iCharCountOccurance in oCharOccuranceMap) {
        if (oCharOccuranceMap[iCharCountOccurance] === 1) {
            bIsValidString = true;
        }
    }
}
else {
    bIsValidString = false;
}

(bIsValidString) ? console.log("YES") : console.log("NO");

在 2 個測試用例失敗的情況下進行了幾次迭代后,我終於想出了下面的正確解決方案。

//create histogram to count occurances of each char in string
let chars               = s.reduce(into: [:]) { $0[$1, default:0] += 1 }

//create set for occurances to determine the number of different occurances found
let valueSet:Set<Int> = Set(chars.values)
var isValid = false

//if all chars have same occurrance
if valueSet.count == 1 {
    isValid = true
}
//if there are more than two different occurance counts
else if valueSet.count > 2 {
    isValid = false
} 
//check different frequencies counts
else {
    
    let freq1 = valueSet.min()!
    let freq2 = valueSet.max()!
    
    var freq1Count = 0
    var freq2Count = 0
    
    //loop through all values to count the amount of times each different occurance count occur
    for value in chars.values {
        switch value {
        case freq1:
            freq1Count += 1
        default:
            freq2Count += 1
        }
    }
    
    //if either freq count is 1 and it that count only occurs once
    if (freq1 == 1 && freq1Count == 1) ||
       (freq2 == 1 && freq2Count == 1) {
        isValid = true
    }
    //if the difference between frequencies is one and there is only one of them
    else if abs(freq1 - freq2) == 1 && (freq1Count == 1 || freq2Count == 1) {
        isValid = true
    }
    else {
        isValid = false
    }
}

return isValid ? "YES" : "NO"

暫無
暫無

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

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