我是新手,我在Codewars的这个问题上陷入困境。问题是;
“给出两个数组a和b编写一个函数comp(a,b)(在Clojure中为compSame(a,b)),该函数检查两个数组是否具有“相同”元素,并且具有相同的多重性。 “相同”在这里表示b中的元素是平方的元素,与顺序无关。” *
a = [121,144,19,161,19,144,19,11]
b = [121,14641,20736,361,25921,361,20736,361]comp(a,b)返回true,因为在b 121中是11的平方,14641是 121、20736平方,144、361平方,19、25921平方 161的平方,依此类推。
如果我们将第一个数字更改为其他数字,则comp可能不会返回true 不再了:
a = [121,144,19,161,19,144,19,11]
b = [132,14641,20736,361,25921,361,20736,361]comp(a,b)返回false,因为在b 132中不是任何a的平方。
我认为可以检查所有数组的算法,但我无法实现。这是C语言。我正在Visual Studio上编写代码,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
int tempVal1;
int tempVal2;
bool comp(int *a, int *b, size_t sizeArray)
{
if (sizeArray == 0 || sizeArray == 0)
return false;
for (int k = 0; k < sizeArray; k++)
{
for (int i = 0; i < sizeArray; i++)
{
if (a[k] == sqrt(b[i]))
tempVal1 = 1;
else
tempVal1 = 0;
printf("%d", tempVal1);
}
}
for (int k = 0; k < sizeArray; k++)
{
for (int i = 0; i < sizeArray; i++)
{
if (b[k] == (a[i] * a[i]))
tempVal2 = 1;
else
tempVal2 = 0;
printf("%d", tempVal2);
}
}
printf(" tempval1 : %d\n", tempVal1);
printf(" tempval2 : %d\n", tempVal2);
if (tempVal1 * tempVal2)
return true;
return false;
}
int main() {
bool result;
int a[8] = { 121, 144, 19, 161, 19, 144, 19, 11 };
int b[8] = { 121 * 121, 144 * 144, 19 * 19, 161 * 161, 19 * 19, 144 * 144, 362, 11 * 11 };
result = comp(a, b, 8);
printf("%d\n", result);
}
答案 0 :(得分:0)
一种解决方案是遍历“ b”中每个元素的“ a”中每个元素,并检查“ b”中是否存在“ a”的平方。
复杂度为O(n^2)
。
bool comp(int *a, int *b, size_t sizeArray)
{
for (int k = 0; k < sizeArray; k++)
{
for (int i = 0; i < sizeArray; i++)
{
if(b[i]<0)
return false;
if ((a[k]==0 && b[i]==0) || (a[k] ==(b[i]/a[k]) && (b[i]%a[k]==0)))
break;
if(i+1==sizeArray)
return false;
}
}
return true;
}
另一种解决方案是对两个数组进行排序-O(nlogn)
并选中if a[i]==b[i]/a[i] && b[i]%a[i]==0
,即O(n)
。
总复杂度为O(nlogn)
答案 1 :(得分:0)
OP的代码在功能上是错误的,因为tempVal1
,tempVal2
仅取决于最终循环a[k] == sqrt(b[i]))
和(b[k] == (a[i] * a[i])
的比较。
相反,内部for (i...)
循环需要找到匹配项。如果找不到,请返回false
。
bool comp(const int *a, const int *b, size_t sizeArray) {
for (size_t k = 0; k < sizeArray; k++) {
size_t i;
for (i = 0; i < sizeArray; i++) {
long long aa = (long long) a[i] * a[i];
if (aa == b[k]) {
break;
}
}
// Since the loop did not exit early, no match was found, return fasle
if (i == sizeArray) {
return false;
}
}
for (size_t k = 0; k < sizeArray; k++) {
size_t i;
for (i = 0; i < sizeArray; i++) {
long long aa = (long long) a[k] * a[k];
if (aa == b[i]) {
break;
}
}
// Since the loop did not exit early, no match was found, return fasle
if (i == sizeArray) {
return false;
}
}
return true;
}
将FP数学用于整数问题会导致最好避免的精度,范围和舍入问题。
考虑没有这些问题的“正方形”测试
bool is_aa_square_of_a(int aa, int a) {
if (aa < 0) return false;
if (a == 0) {
return aa == 0;
}
int q = aa/a;
int r = aa%a;
return q == a && r == 0;
}
注意:使用排序数组可以使代码更省时。