我正在做一个加扰数组,我必须比较两个数组,看它们的内容是否匹配。我看过其他乱码阵列解决方案,但对于我的任务,我不能以任何方式更改阵列(没有排序)。
#include <stdio.h>
int scrambled(unsigned int a[], unsigned int b[], unsigned int len){
int firstCheck = 0;
int secondCheck = 0;
int i = 0;
int j = 0;
for(i=0; i < len; i++){
firstCheck = 0;
for(j=0; j< len; j++){
if(a[i] == b[j]){
firstCheck = 1;
}
}
if(firstCheck != 1){
firstCheck = 0;
break;
}
}
for(j=0; j < len; j++){
secondCheck = 0;
for(i=0; i< len; i++){
if(b[j] == a[i]){
secondCheck = 1;
}
}
if(secondCheck != 1){
secondCheck = 0;
break;
}
}
if(len == 0){
return 1;
}else if (firstCheck == 0 || secondCheck == 0){
return 0;
}else{
return 1;
}
}
我得到了一些数组示例来测试代码是否有效以及所有代码是否正常工作。如果数组为空,则应返回1;。我的代码通过了所有测试,但评分程序不接受我的代码。我想知道我是否错过了重要的支票?
scrambled应返回1的数组示例:
a = {10,15,20}, b = {10,15,20}
a = {99}, b = {99}
a = {1,2,3,4,5}, b = {5,3,4,2,1}
a = {}, b = {} (i.e. len = 0)
a = {2,1,3,4,5}, b = {1,2,4,3,5}
scrambled应返回的数组示例为0:
a = {1,1}, b = {1,2}
a = {10,15,20}, b = {10,15,21}
a = {1,2,3,4,5}, b = {5,3,4,2,2}
我有一个主要的测试代码,我会发布以防万一。
#include <stdio.h>
#include <stdbool.h>
int scrambled (unsigned int a[], unsigned int b[], unsigned int len);
int main(){
unsigned int a[5] = {1,2,3,4,5};
unsigned int b[5] = {5,3,4,2,2};
bool result;
result = (scrambled(a,b,5));
if(result == 1){
printf("b is a scrambled version of a\n");
}else{
printf("b is NOT a scrambled version of a\n");
}
return 0;
}
修改:
感谢所有回复!我将尝试清理我的代码并尝试提到的方法(辅助数组/辅助函数/返回语句)。我会确保下次只标记一个C,因为我知道它们非常不同。我很高兴听到这不是一个逻辑问题,所以也许我读错了。如果有人想看,请在下面发布。 (对于#4,它说iff数组,我认为这是一个错字,是吗?)
1)创建一个名为scrambled.c的新文件,其中包含一个与此声明匹配的函数:
2)int scrambled(unsigned int a [],unsigned int b [],unsigned int len);
3)数组a和b都是长度为len,并且仅包含[0 99]范围内的值。
4)函数scrambled()应该返回1 iff数组a和b包含任何顺序的相同值,否则返回0。
5)len可以有任何unsigned int值,包括0。
6)如果len为0,则scrambled()应返回1(因为数组具有相同的 - empty - 内容)。
7)您不得更改数组的内容。
8)使用在数组长度n中具有线性运行时间的算法。请注意,这意味着您无法对数组进行排序,因为这不能在线性时间内完成。
如果我能解决这个问题,我会更新!
答案 0 :(得分:1)
您的代码不再是N或O(N)线性时间的Big-O。由于您的代码中有两个“ for循环”。要求指出您必须在线性时间内运行。
答案 1 :(得分:1)
为了在线性时间内运行,实际上有一种利基的程序编码方式。首先,我们必须创建一个包含100个元素的数组,并将其初始化为零。
newarray [100] = {0};
然后,您将遍历数组并计算一个数字在该索引中出现的次数(将一个数字添加到该索引处的计数器数组)。这仅适用于0-100,这在要求之内。您将遍历两个数组,并为两个数组都拥有“计数器数组”。
例如。
例如,假设我的array1是1,3,3。我的counter1看起来像1,0,2,0,0,0,0,0,0,0,0 ... 0(一直到一百个索引)。
我的array2是3,3,1。我的counter2仍然会出现相同的出现次数(1,0,2,0,0,0,0,0,0,0,0 ... 0),因为我们遍历了每个数组并计算了每个数字,然后向该索引添加一个。
然后最后从计数器比较两个数组
答案 2 :(得分:0)
我在代码中看不到任何逻辑错误。因此,除非您错过了作业中规定的某些规则,否则您的代码应通过测试。
正如评论中所述,我建议引入一个辅助函数,以避免两个非常相似的代码片段:
#include <stdio.h>
#include <stdbool.h>
bool firstIsContainedInSecond(unsigned int a1[], unsigned int a2[], unsigned int len) {
for(int i=0; i < len; i++){
bool contained = false;
for(int j=0; j< len; j++){
if(a1[i] == a2[j]){
contained = 1;
break;
}
}
if (!contained)
return false;
}
return true;
}
int scrambled(unsigned int a[], unsigned int b[], unsigned int len){
if(len == 0){
return 1;
} else if (! firstIsContainedInSecond(a, b, len)){
return 0;
} else if (! firstIsContainedInSecond(b, a, len)){
return 0;
}else{
return 1;
}
}