簡體   English   中英

如何交換數組中的一對元素並檢查它們是否相等?

[英]How to swap one pair of elements in an array and check to see if they are equal?

我正在嘗試為 CodeFights 上的 javascript 問題編寫代碼。

如果一個數組可以通過交換其中一個數組中的最多一對元素從另一個數組中獲得,則兩個數組稱為相似數組。

到目前為止,這是我想出的。 我遇到的問題是這段代碼沒有通過所有的測試。

function areSimilar(a, b) {
    if (a.join() === b.join()) {
        return true;
    }
  for (var i = 0; i < a.length-1; i++) {
      for (var j = 1; j < a.length; j++) {
          if (swap(a, i, j).join()=== b.join()) {
              return true;
          }
      }
  }
    return false;
}

function swap(target, start, end) {
    var temp = target[start];
    target[start] = target[end];
    target[end] = temp;
    return target;
}

如果我將以下代碼添加到第 10 行(在 if 語句之后),它會通過測試但不會通過輸出時間:

  console.log(swap(a,i,j));

如果有人能指出我研究的正確方向/為什么會發生這種情況,我將不勝感激。

這是一個 O(n) 時間和 O(n) 空間的解決方案

 function areSimilar(arr1, arr2) { if (arr1.length !== arr2.length) return false; let diff = [];// initialize array that'll be used to track indices where values differ for (let i = 0; i < arr1.length; i++) {// loop thru first array if (arr1[i] !== arr2[i]) { //check for value differences between arrays at each index diff.push(i); //if the values differ push index into diff array if (diff.length > 2) return false; if (diff.length === 2) { // use the diff array indices to swap, if swapped pairs are not eqaul return false; if (arr1[diff[0]] !== arr2[diff[1]] || arr1[diff[1]] !== arr2[diff[0]]) { return false; } } } } //if it makes it through all of that return diff.length === 0 || diff.length === 2; } console.log(areSimilar([1, 2, 3, 4], [1, 3, 2, 4])); console.log(areSimilar([1, 2, 3, 4, 5], [1, 3, 2, 5, 4])); console.log(areSimilar([1, 2, 6, 4, 5], [1, 2, 3, 5, 4]));

我的工作解決方案:

function areSimilar(a, b) {
  if (JSON.stringify(a) === JSON.stringify(b)) return true;
  const nums1 = [];
  const nums2 = [];

  for (let i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) {
      nums1.push(a[i]);
      nums2.push(b[i]);
    }
  }

  const unique = new Set([...nums1, ...nums2]);

  if (nums1.length === 2 && nums2.length === 2 && unique.size === 2) return true;
  else return false;
}

areSimilar([1, 2, 3], [2, 1, 3]);

swap()需要返回一個新數組,而不是修改原始數組。 否則,您將在陣列中累積多個交換。

 function swap(target, start, end) { var result = target.slice(); // Make copy of target result[start] = target[end]; result[end] = target[start]; return result; } function areSimilar(a, b) { if (a.join() === b.join()) { return true; } for (var i = 0; i < a.length - 1; i++) { for (var j = 1; j < a.length; j++) { if (swap(a, i, j).join() === b.join()) { return true; } } } return false; } console.log(areSimilar([1, 2, 3, 4], [1, 3, 2, 4])); console.log(areSimilar([1, 2, 3, 4, 5], [1, 3, 2, 5, 4])); console.log(areSimilar([1, 2, 6, 4, 5], [1, 2, 3, 5, 4]));

您可以進行的其他一些改進:

  1. 檢查兩個數組的長度是否相同。
  2. 內部循環可以從j = i + 1而不是j = 1 這樣,您就不會以相反的順序測試同一對元素,或者將元素與其自身交換。
  3. b.join()的副本保存在變量中,這樣您就不必繼續這樣做了。

暫無
暫無

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

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