此函数采用表示鹅卵石和的字符数组 将数组重新排列为RED,WHITE和BLUE字符。 重新排列时交换的数量也会返回。 如果输入合法且重新排列,则该函数返回1 成功。如果在中找到非法字符,则返回0 输入
boolean processInput(char *pebbles, int *noOfSwaps){
int low;
int mid;
int high;
*noOfSwaps = 0;
low = 0;
while (low < strlen(pebbles) && color(*(pebbles + low)) == RED)
low++;
high = strlen(pebbles) - 1;
while (high >= 0 && color(*(pebbles + high)) == BLUE)
high--;
mid = low;
while (mid <= high){
if (color(*(pebbles + mid)) == RED){
if (mid == low){
low++;
mid++;
}
else{
swap((pebbles + mid), (pebbles + low));
(*noOfSwaps)++;
low++;
mid++;
}
}
else if (color(*(pebbles + mid)) == WHITE)
mid++;
else if (color(*(pebbles + mid)) == BLUE){
if (color(*(pebbles + high)) == BLUE)
high--;
else{
swap((pebbles + mid), (pebbles + high));
(*noOfSwaps)++;
high--;
}
}
else
return 0;
}
return 1;
}
^^^上面是我的代码。只是一个功能。需要知道该函数的最坏情况复杂性和原因。谢谢!
答案 0 :(得分:1)
当所有鹅卵石都是红色时,此行会导致最小O(n) + O(color())
。如果颜色为O(1)
(它可能是),那么它只是O(n)
:
while (low < strlen(pebbles) && color(pebbles[low]) == RED)
low++;
代码的其余部分似乎只检查每个元素的颜色一次,因此也是O(n) + O(color())
。
所以我要去O(n)
。
编辑:抓一点,他在那个while循环中调用strlen
。我要将其升级到O(n^2)
。其中n
是pebbles
的长度。让它回到O(n)
会很简单。调用strlen()
一次,然后缓存该值。