我正在努力使我的代码更加高效。请诚实地告诉我如何修复它以及它是否是“意大利面条代码”。
CodeSignal 不同的方块
给定一个仅包含数字的矩形矩阵,计算其中不同的 2 × 2 正方形的数量。
例子: 对于矩阵 =
[[1, 2, 1],
[2,2,2],
[2,2,2],
[1,2,3],
[2,2,1]]
输出应该是 differentSquares(矩阵) = 6.
这里有 6 个不同的 2 × 2 正方形:
1 2
2 2
2 1
2 2
2 2
2 2
2 2
1 2
2 2
2 3
2 3
2 1
我当前的代码:
function differentSquares(matrix) {
let smallSquares = [];
for(let i = 0; i < matrix.length - 1; i++){
buildCurr(matrix, i, smallSquares);
}
return smallSquares.length;
}
function compareArrs(smallSquares, currentSquare){
let includes = smallSquares.find((arr) => arr.join("") === currentSquare.join(""));
if(!includes){
smallSquares.push(currentSquare);
}
}
function buildCurr(matrix, i, smallSquares){
for(let j = 0; j < matrix[i].length - 1; j++){
let currentSquare = [matrix[i][j], matrix[i][j+1], matrix[i+1][j], matrix[i+1][j+1]];
compareArrs(smallSquares, currentSquare);
}
}
我遇到的错误:
测试通过:9/13。测试 10 超出执行时间限制:程序超出执行时间限制。确保它在几秒钟内完成任何可能的输入的执行。 单击“运行测试”按钮可查看示例或自定义测试用例的输出、控制台日志和详细错误消息。单击“提交”按钮时会隐藏此信息,以防止对隐藏测试用例的硬编码解决方案。
测试示例: 7/7
隐藏测试: 2/6
得分: 167/300
我意识到这可能与 O 表示法有关。当我将它分成另一个函数时,它变得更好,这就是我这样做的原因。
我用这种方式解决了这个问题,我使用一个数组将所有小方块存储为字符串,并使用“include”操作来查找该数组中已有的值。
function differentSquares(matrix) {
let smallSquares = [];
var value = "";
for(let i = 0; i < matrix.length - 1; i++){
for(let j = 0; j < matrix[i].length - 1; j++){
value = (`${matrix[i][j]}${matrix[i][j+1]}${matrix[i+1][j]}${matrix[i+1][j+1]}`)
if(!smallSquares.includes(value)){
smallSquares.push(value);
}
}
}
return smallSquares.length;
}
我希望它也能帮助任何寻找答案的人
尝试使用集合而不是数组
function differentSquares(matrix) {
s = new Set()
for (i = 0; i < matrix.length-1; i++) {
for (j = 0; j < matrix[i].length-1; j++) {
s.add([matrix[i][j], matrix[i][j+1], matrix[i+1][j], matrix[i+1][j+1]].toString())}}
return s.size
}
我这样做了 - 类似于上面 - 使用 C#
int solution(int[][] matrix) {
var s = new HashSet<string>();
for(int i = 0; i < matrix.Length - 1; i ++)
{
for(int j = 0; j < matrix[i].Length - 1; j++)
{
var str = $"{matrix[i][j]}, {matrix[i][j+1]}, {matrix[i+1][j]}, {matrix[i+1][j+1]}";
s.Add(str);
}
}
return s.Count();
}
不需要预先存储任何内容 - 使用哈希集 - 我们不会添加已经找到的内容