兩個數組的交集
給定兩個數組,編寫一個函數來計算它們的交集。輸出結果中每個元素出現的次數,應與元素在兩個數組中出現的次數一致。我們可以不考慮輸出結果的順序。
示例:
輸入: nums1 = [1,2,2,1], nums2 = [2,2]
輸出: [2,2]
輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [4,9]
- 方法一:數組切割處理
//執行用時 :64 ms, 在所有 javascript 提交中擊敗了91.85%的用戶
//內存消耗 :33.8 MB, 在所有 javascript 提交中擊敗了86.17%的用戶
var intersect = function(nums1, nums2) {
var res = [];
//包含之後再清除
for(var i=0;i<nums1.length;i++){
if(nums2.includes(nums1[i])){
res.push(nums1[i]);
nums2.splice(nums2.indexOf(nums1[i]), 1);
}
}
return res;
};
//執行用時 :72 ms, 在所有 javascript 提交中擊敗了66.52%的用戶
//內存消耗 :33.9 MB, 在所有 javascript 提交中擊敗了72.60%的用戶
var intersect = function (nums1, nums2) {
return nums1.filter(el => nums2.includes(el) && nums2.splice(nums2.indexOf(el), 1))
};
- 方法二:字典
多加了記錄元素個數的功能,我們可以使用字典 dict 實現它
//執行用時 :76 ms, 在所有 javascript 提交中擊敗了52.47%的用戶
//內存消耗 :34.7 MB, 在所有 javascript 提交中擊敗了50.79%的用戶
var intersect = function (nums1, nums2) {
var len1 = nums1.length;
var len2 = nums2.length;
if (len1 === 0 || len2 === 0) {
return [];
}
var dict1 = {};
var result = [];
nums1.forEach((item, index) => {
if (dict1.hasOwnProperty(item)) {
dict1[item] += 1;
} else {
dict1[item] = 1;
}
})
nums2.forEach((item) => {
if (dict1.hasOwnProperty(item) && dict1[item] > 0) {
result.push(item);
dict1[item] -= 1;
}
})
return result;
}
// 執行用時 :68 ms, 在所有 javascript 提交中擊敗了82.19%的用戶
// 內存消耗 :36 MB, 在所有 javascript 提交中擊敗了12.23%的用戶
var intersect = function (nums1, nums2) {
var obj1 = arrChange(nums1);
var obj2 = arrChange(nums2);
var res = [];
for (var pro in obj1) {
if (obj2.hasOwnProperty(pro)) {
obj1[pro].length < obj2[pro].length ? res.push(...obj1[pro]) : res.push(...obj2[pro]);
}
}
return res;
};
function arrChange(arr) {
var obj = {};
arr.forEach((item, index) => {
if (obj.hasOwnProperty(item)) {
obj[arr[index]].push(item);
} else {
obj[arr[index]] = [item];
}
})
return obj;
}
有效的字母異位詞
給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是否是 s 的字母異位詞
示例:
輸入: s = "anagram", t = "nagaram"
輸出: true
輸入: s = "rat", t = "car"
輸出: false
- 方法一:字典對各個字符出現的次數進行統計
var isAnagram = function (s, t) {
if (s.length != t.length) {
return false;
}
var calT = cal(t);
for (var ele of s) {
if (!t.includes(ele) || calT[ele] == 0) {
return false;
}
calT[ele]--;
}
return true;
};
function cal(str) {
var times = {};
for (var ele of str) {
if (times.hasOwnProperty(ele)) {
times[ele]++;
} else {
times[ele] = 1;
}
}
return times;
}
- 方法二:轉換成數組排序後對比
//執行用時 :116 ms, 在所有 javascript 提交中擊敗了48.25%的用戶
//內存消耗 :38.6 MB, 在所有 javascript 提交中擊敗了28.30%的用戶
var isAnagram = function (s, t) {
return JSON.stringify(s.split('').sort()) === JSON.stringify(t.split('').sort());
};
//執行用時 :132 ms, 在所有 javascript 提交中擊敗了26.88%的用戶
//內存消耗 :38.1 MB, 在所有 javascript 提交中擊敗了43.10%的用戶
var isAnagram = function (s, t) {
return s.split('').sort().join('') === t.split('').sort().join('')
};
var isAnagram = function (s, t) {
const sort = str => [...str]
.sort((a, b) => a.charCodeAt() - b.charCodeAt())
.join('')
return sort(s) === sort(t) //如果輸入字符串包含 unicode 字符
};
同構字符串
給定兩個字符串 s 和 t,判斷它們是否是同構的。如果 s 中的字符可以被替換得到 t ,那麼這兩個字符串是同構的。所有出現的字符都必須用另一個字符替換,同時保留字符的順序。兩個字符不能映射到同一個字符上,但字符可以映射自己本身。
示例:
輸入: s = "egg", t = "add"
輸出: true
輸入: s = "foo", t = "bar"
輸出: false
輸入: s = "paper", t = "title"
輸出: true
- 比較每個字符下一次出現位置是否一致
//執行用時 :60 ms, 在所有 javascript 提交中擊敗了99.19%的用戶
//內存消耗 :35.3 MB, 在所有 javascript 提交中擊敗了66.33%的用戶
var isIsomorphic = function (s, t) {
if (s.length != t.length) {
return false;
}
for (let i = 0; i < s.length; i++) {
if (s.indexOf(s[i], i + 1) !== t.indexOf(t[i], i + 1)) {
return false;
}
}
return true;
};
- 哈希,記錄兩個字符串中的被替換字符和替換字符,判斷是否是唯一
//執行用時 :72 ms, 在所有 javascript 提交中擊敗了81.91%的用戶
//內存消耗 :35.2 MB, 在所有 javascript 提交中擊敗了74.49%的用戶
var isIsomorphic = function (s, t) {
if (s.length !== t.length) return false;
let hashOne = {}, hashTwo = {}, len = s.length;
for (let i = 0; i < len; i++) {
let a = s[i], b = t[i];
if (!hashOne[a] && !hashTwo[b]) {
hashOne[a] = b;
hashTwo[b] = a;
} else if (hashOne[a] !== b || hashTwo[b] !== a) {
return false;
}
}
return true;
};
//執行用時 :80 ms, 在所有 javascript 提交中擊敗了54.02%的用戶
//內存消耗 :35.8 MB, 在所有 javascript 提交中擊敗了48.98%的用戶
var isIsomorphic = function (s, t) {
//同構則說明能相互轉化
var map = new Map();
var map2 = new Map();
for (var i = 0; i < s.length; i++) {
map.set(s[i], t[i]);
map2.set(t[i], s[i])
}
for (var j = 0; j < s.length; j++) {
if (map.get(s[j]) !== t[j]) {
return false;
}
if (map2.get(t[j]) !== s[j]) {
return false;
}
}
return true;
};
- 數組,判斷被替換字符與替換字符一一對應
//執行用時 :68 ms, 在所有 javascript 提交中擊敗了89.95%的用戶
//內存消耗 :35.7 MB, 在所有 javascript 提交中擊敗了51.02%的用戶
var isIsomorphic = function(s, t) {
var a=[],l=[];
if(s.length==0){
return true;
}
for(var i=0;i<s.length;i++){
if(s[i] in a){
if(a[s[i]]!==t[i]){ //已經替換過的情況下,被替換字符與替換字符唯一對應
return false;
}
}else{
if(l.indexOf(t[i])!==-1){ //替換字符唯一
return false;
}
a[s[i]]=t[i];
l.push(t[i]);
}
}
return true;
};
根據字符出現頻率排序
給定一個字符串,請將字符串裏的字符按照出現的頻率降序排列
示例:
輸入:
"tree"
輸出:
"eert"
解釋:
'e'出現兩次,'r'和't'都只出現一次。
因此'e'必須出現在'r'和't'之前。此外,"eetr"也是一個有效的答案。
輸入:
"Aabb"
輸出:
"bbAa"
解釋:
此外,"bbaA"也是一個有效的答案,但"Aabb"是不正確的。
注意'A'和'a'被認爲是兩種不同的字符。
- map
//執行用時 :76 ms, 在所有 javascript 提交中擊敗了96.69%的用戶
//內存消耗 :38.4 MB, 在所有 javascript 提交中擊敗了54.05%的用戶
var frequencySort = function(str) {
let map = new Map()
let result = ''
str.split('').forEach(item => {
if (map.has(item)) {
map.set(item, map.get(item) + 1)
} else {
map.set(item, 1)
}
})
map = [...map]
.sort((a, b) => b[1] - a[1])
.map(item => {
result += item[0].repeat(item[1])
})
return result
}
//執行用時 :136 ms, 在所有 javascript 提交中擊敗了7.28%的用戶
//內存消耗 :44 MB, 在所有 javascript 提交中擊敗了24.32%的用戶
var frequencySort = function (s) {
const sArr = [...s];
const record = new Map();
sArr.forEach(value => {
record.set(value, (record.get(value) || 0) + 1)
})
return sArr.sort((a, b) => record.get(b) == record.get(a) ? a.charCodeAt(0) - b.charCodeAt(0) : record.get(b) - record.get(a)).join('');
};
- 字典
//執行用時 :100 ms, 在所有 javascript 提交中擊敗了40.40%的用戶
//內存消耗 :44.6 MB, 在所有 javascript 提交中擊敗了10.81%的用戶
var frequencySort = function (s) {
var calTimes = {};
for (let str of s) {
if (!calTimes.hasOwnProperty(str)) {
calTimes[str] = 1;
} else {
calTimes[str]++;
}
}
var sortStr = sortObj(calTimes);
var res = '';
sortStr.forEach((key) => {
while (calTimes[key] > 0) {
res += key;
calTimes[key]--;
}
})
return res;
}
function sortObj(obj) {
return Object.keys(obj).sort((a, b) => {
return obj[b] - obj[a];
})
}
題目來源於leetcode: https://leetcode-cn.com/explore