我正在练习可以在链表中查找冗余的代码。 例如:
输入
777
输出
包含2个冗余
输入
32182
输出
包含1个冗余
我正在努力在代码中实际跟踪冗余。我对链表进行了排序,然后假设我将创建2个指针,它们将遍历链表的当前位置,并且将遍历链表的先前位置,如果它们等于count ++。但是我总是得到0个冗余。
在下面的代码中,我认为我的挑战主要在于countRedun()方法。
struct digit * insertAtFront(struct digit *start, struct digit * newDig){
struct digit * ptr = start;
newDig = start;
return newDig;
}
struct digit * insertIntoSorted(struct digit *start, struct digit *newDig) {
struct digit *ptr = start;
struct digit *prev = NULL;
while ((ptr!=NULL) && (ptr->num < newDig->num)) {
prev = ptr;
ptr = ptr->next;
}
if (prev == NULL) {
start = insertAtFront(start, newDig);
} else {
prev->next = newDig;
newDig->next = ptr;
}
return(start);
}
struct digit * sortedCopy(struct digit * start) {
//! heap1=showMemory(start=348, cursors=[start, ptr, sortedStart, newDigit])
//! heap2=showMemory(start=519, cursors=[start, newDigit, ptr, prev])
struct digit *ptr = start;
struct digit *sortedStart = NULL;
struct digit *newDigit;
if (start!=NULL) {
sortedStart = createDigit(start->num);
ptr = ptr->next;
}
while (ptr!=NULL) {
newDigit = createDigit(ptr->num);
sortedStart = insertIntoSorted(sortedStart, newDigit);
ptr = ptr->next;
}
return(sortedStart);
}
int countRedun(struct digit * start){
struct digit *sorted, *ptr, *prev, * curr;
ptr = start;
prev = start;
//sort linked list
sorted = sortedCopy(start);
int count = 0;
while(ptr != NULL)
{
if(ptr->num == prev->num)
{
count++;
}
prev = ptr;
ptr = ptr->next;
}
}
假设问题的关键在于排序和计数方法,我已经排除了要求用户输入的代码以及链接列表创建者方法。
答案 0 :(得分:2)
我认为问题出在HtmlWebViewSource
WebView
请记住,一切都是通过值传递的。您的<WebView x:Name="yourWebView" Source="{Binding HtmlSource}" WidthRequest="1000" HeightRequest="1000" />
变量根本没有使用,在此函数中insertAtFront
和struct digit * insertAtFront(struct digit *start, struct digit * newDig){
struct digit * ptr = start;
newDig = start;
return newDig;
}
是局部变量。真的等价于:
ptr
再看看该功能。我不确定您的上下文,但是您可以使用调试器或printf语句查看发生了什么。
答案 1 :(得分:2)
看来sortedCopy构成了一个完整的新列表,但已排序。如果是这样,那么您需要重新排序:
process.exit()
具有:
ptr = start;
prev = start;
//sort linked list
sorted = sortedCopy(start);
作为注释,您可能会更好:
//sort linked list
sorted = sortedCopy(start);
ptr = sorted;
prev = sorted;
否则,您的计数始终将减一。
答案 2 :(得分:2)
如果您确定:
0
和9
之间的数字然后,您无需对数据进行排序(顺便说一句,您正在以O(n ^ 2)的时间复杂度进行操作)。
您需要做的就是保留一个数组,其中包含10个初始化为0
的元素,增加元素的相应索引并计算值大于1
的元素。
与此类似的东西(请注意:未经测试):
int countRedun(struct digit * start){
int counter[10] = {0};
struct digit *ptr = start;
int total = 0;
while(ptr != NULL)
{
counter[ptr->num]++;
ptr = ptr->next;
}
for (int i = 0; i < 10; i++) {
if (counter[i] > 1) {
total += counter[i] - 1;
}
}
return total;
}