【问题标题】:My program return sometime true, but not always Codewars question "Are they same"我的程序有时会返回真实,但并非总是 Codewars 问题“它们是否相同”
【发布时间】:2018-10-03 15:43:54
【问题描述】:

我是一个新手,我被 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) 返回真,因为在 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);
}

【问题讨论】:

  • { 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 362, 11*11 } 中,362 不等于 19^2。
  • 是 C 还是 C++?
  • 尝试先对两个数组进行排序,这将使您的算法更简单
  • @Jabberwocky 它是 C Jabber
  • @fury 你在b 中的所有元素都是a 中的相同元素的平方,对吧?如果是这样,362 应该是 361,因为 19^2 是 361

标签: c algorithm


【解决方案1】:

OP 的代码在功能上是错误的,因为 tempVal1tempVal2 仅取决于最终循环 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; 
}

注意:使用排序数组可以提高代码的时间效率。

【讨论】:

  • 非常感谢您的回答和花费您的时间。它工作正常。
【解决方案2】:

一种解决方案是遍历 '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] &amp;&amp; b[i]%a[i]==0,这将是O(n)

所以总复杂度是O(nlogn)

【讨论】:

  • @Kevin 是的,应该改了。
  • 感谢您的回答 Natarajan。
  • 不错的改进 - 现在只有小角落 a[k] == -1, b[i] == INT_MIN 破坏了代码。
  • @chux 如何处理这种情况。如果我的结果是long而不是int,它会有效吗?有什么办法可以改善吗?
  • @NivedhithaNatarajan 注意intlong 可能是同一个范围,所以使用long 不是一个确定的解决方案。可以使用 some 更宽的类型,例如 long longintmax_t,但即使这些也不一定比 int 宽 - 比 long 更可能。高度可移植的代码通过某种方式简单地测试以确保a[k] == -1 &amp;&amp; b[i] == INT_MINb[i]/a[i] 之前不是真的。示例:is_aa_square_of_a().
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 2020-11-27
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多