- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
接下来的挑战是:
At a job interview, you are challenged to write an algorithm to check if a given string, s, can be formed from two other strings, part1 and part2. The restriction is that the characters in part1 and part2 are in the same order as in s. The interviewer gives you the following example and tells you to figure out the rest from the given test cases.
我做错了什么?为什么它还是失败了?
我写了 2 个不同的脚本,但都不适用于某些测试用例
function isMerge(s, part1, part2) {
var sArr = s.split('');
var part1Arr = part1.split('');
var part2Arr = part2.split('');
var tempArr = new Array(sArr.length);
function compareArrays(arr1, arr2){
var count = 0;
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) count++;
}
return (count == 0);
}
for (var i = 0; i < sArr.length; i++) {
for (var j = 0; j < part1Arr.length; j++) {
if (sArr[i] == part1Arr[j]) tempArr[i] = j;
}
for (var k = 0; k < part2Arr.length; k++) {
if (sArr[i] == part2Arr[k]) tempArr[i] = k;
}
}
alert(tempArr);
var check = tempArr.slice();
check.sort();
alert(check);
if (compareArrays(tempArr, check)) return true;
else return false;
}
alert(isMerge('codewars', 'cdw', 'oears'));
function isMerge(s, part1, part2) {
// create arrays of letters
var sArr = s.split('');
var part1Arr = part1.split('');
var part2Arr = part2.split('');
// create an associative array 'temp' (0:C, 1:O and so on)
var temp = {};
for (var k = 0; k < sArr.length; k++) {
temp[k] = sArr[k];
}
// reverse an associative array 'temp' (now C:0, O:0 and so on)
for (var key in temp) {
var keyTemp = key;
var keyValue = temp[key];
key = keyValue;
temp[key] = keyTemp;
}
// the function that compares arrays
function compareArrays(arr1, arr2){
var count = 0;
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) count++;
}
return (count == 0);
}
// sorting function
function order(a, b) {
var comparingA;
var comparingB;
for (var char in temp) {
if (char == a) {
comparingA = temp[char]; // comparingA is the number of 'a' in object 'temp'
}
if (char == b){
comparingB = temp[char]; // comparingB is the number of 'b' in object 'temp'
}
}
return (comparingA - comparingB);
}
// create copies of arrays
var part1Sorted = part1Arr.slice();
var part2Sorted = part2Arr.slice();
// and sort that copies
part1Sorted.sort(order);
part2Sorted.sort(order);
// If the array did not change after sorting, the order of the letters was correct
if (compareArrays(part1Sorted, part1Arr) && compareArrays(part2Sorted, part2Arr)) {
// so now we can check is merge possible
sArr = sArr.sort();
var parts = part1Arr.concat(part2Arr);
parts = parts.sort();
var res = compareArrays(sArr, parts);
return res;
}
return false;
}
alert(isMerge('codewars', 'code', 'wasr'));
alert(isMerge('codewars', 'oers', 'cdwa'));
我刚刚在第二个脚本中添加了注释
最佳答案
我发现很难理解您的代码试图做什么。如果您提供评论并解释您尝试实现的算法背后的想法,将会有所帮助。
下面是一个带注释的递归示例,它考虑指向第 1 部分和第 2 部分的指针 i
和 j
是否可以构成到该点为止的有效合并。
function isMerge(s, part1, part2) {
// Merge is invalid if the parts' lengths don't add up to the string's
if (part1.length + part2.length != s.length)
return false;
// Recursive function
function g(i, j){
// Base case: both pointers are exactly at the end of each part
if (i == part1.length && j == part2.length)
return true;
// One of our pointers has extended beyond the part's length,
// that couldn't be right
if (i > part1.length || j > part2.length)
return false;
// Just part1 matches here so increment i
if (part1[i] == s[i + j] && part2[j] != s[i + j])
return g(i + 1, j);
// Just part2 matches here so increment j
else if (part1[i] != s[i + j] && part2[j] == s[i + j])
return g(i, j + 1);
// Both parts match here so try incrementing either pointer
// to see if one of those solutions is correct
else if (part1[i] == s[i + j] && part2[j] == s[i + j])
return g(i + 1, j) || g(i, j + 1);
// Neither part matches here
return false;
}
// Call the recursive function
return g(0,0);
}
console.log(isMerge('codewars', 'cdw', 'oears'));
console.log(isMerge('codecoda', 'coda', 'code'));
console.log(isMerge('codewars', 'oers', 'cdwa'));
console.log(isMerge('codewars', 'cdw', 'years'));
非常长的字符串的堆栈版本:
function isMerge2(s, part1, part2) {
if (part1.length + part2.length != s.length)
return false;
let stack = [[0,0]];
while (stack.length){
[i, j] = stack.pop();
if (i == part1.length && j == part2.length)
return true;
if (i > part1.length || j > part2.length)
continue;
if (part1[i] == s[i + j] && part2[j] != s[i + j])
stack.push([i + 1, j]);
else if (part1[i] != s[i + j] && part2[j] == s[i + j])
stack.push([i, j + 1]);
else if (part1[i] == s[i + j] && part2[j] == s[i + j]){
stack.push([i + 1, j]);
stack.push([i, j + 1]);
}
}
return false;
}
function test(){
let s = '';
for (let i=0; i<1000000; i++)
s += ['a','b','c','d','e','f','g'][~~(Math.random()*6)];
let lr = {
l: '',
r: ''
};
for (let i=0; i<s.length; i++){
let which = ['l', 'r'][~~(Math.random()*2)];
lr[which] += s[i];
}
console.log(isMerge2(s,lr.l,lr.r));
}
test();
关于javascript - CodeWars/合并字符串检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49960458/
我大约 2 周前才开始学习编码,遇到了以下问题。我最初将代码编写为双嵌套循环,但不出所料地超时了。我重新编译了我的代码,以便(我认为)具有 O(n) 的渐近运行时间而不是 O(n^2)。我正在寻找使我
问题如下:超市的自助收银台前排起了长队。您的任务是编写一个函数来计算所有客户结帐所需的总时间! 输入:客户:代表队列的正整数数组。每个整数代表一个客户,其值是他们结账所需的时间。n:正整数,收银台数量
我正在尝试解决 codewars 上的 6kyu 问题,并且偶然发现了一个恼人的错误,但我无法找到其根源。任务的快速解释:“给定两个数组 a 和 b 编写一个函数 comp(a, b) 来检查这两个数
所以我决定去 codewars 温习一下 java,我有这个问题需要解决: 给你一个包含整数的数组(长度至少为 3,但可能非常大)。该数组要么完全由奇数整数组成,要么完全由除单个整数 N 之外的偶数整
这个问题已经有答案了: Regex for password must contain at least eight characters, at least one number and both
CodeWars 问题: Create a function named divisors that takes an integer and returns anarray with all of
我被困在 Codewars Kata 中,我希望有人能帮助我(不要破坏解决方案)。事实上,问题是我没有完全理解它应该如何工作,我明白了练习的想法,但事情有点困惑,尤其是在示例测试中。 以下是说明: T
我被下面的任务卡住了,花了大约 3 个小时才弄明白。 任务描述:一个人有一辆值(value) 2000 美元的旧车。他看到一辆值(value) 8000 美元的二手车。他想保留他的旧车,直到他能买到二
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
接下来的挑战是: At a job interview, you are challenged to write an algorithm to check if a given string, s,
问题来了: 新的《复仇者联盟》电影刚刚上映!电影院售票处人山人海,排起了长队。他们每个人都有一张 100、50 或 25 美元的钞票。 “复仇者联盟”门票 25 美元。 Vasya 目前是一名文员。他
问题是: "My friend John and I are members of the "Fat to Fit Club (FFC)". Johnis worried because each m
关闭。这个问题需要details or clarity .它目前不接受答案。 想改善这个问题吗?通过 editing this post 添加详细信息并澄清问题. 去年关闭。 Improve this
希望每个人都有美好的一天。 这是我在 Stackoverflow 上发表的第一篇文章! 我刚刚完成了 Codeacademy 上的 javascript 类(class),并且也阅读了几本相关书籍。现
This Codewars Challenge要求您 Choose exactly one element from the sequence and replace it with another
我正在解决以下代码 war 问题。问题如下所示: Instructions Write a function capitals that takes a single string (word) as
谁能找出这段代码有什么问题吗?我在 CodeWars 上运行代码并通过了除一个之外的所有测试...遗憾的是它没有显示该特定测试的输入内容,因此很难弄清楚。 以下是挑战说明: 新的《复仇者联盟》电影刚刚
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
尝试解决this codewars challenge : Your job is to fix the parentheses so that all opening and closing par
简介 问题在 Link to challenge for best instructions 上有解释 据我所知,如果左侧的元素大于0。 即[2, -4, 6, -6] => [-6, -4, 6,
我是一名优秀的程序员,十分优秀!