這是我的代碼,它總是輸出-1,我不知道為什么。有什么幫助嗎?輸入 第一行包含一個整數 t (1≤t≤104) — 測驗用例的數量。
每個測驗用例的第一行包含一個整數 n (1≤n≤2?105) — 陣列的長度。
每個測驗用例的第二行包含 n 個整數 a1,a2,...,an (1≤ai≤n) — 陣列的元素。
保證所有測驗用例的 n 之和不超過 2?105。
輸出 對于每個測驗用例,列印至少出現 3 次的任何值,如果沒有這樣的值,則列印 -1。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, size,*arr, *frr,count,*ptr,g,s;
scanf("%d", &n);
ptr = (int*)malloc(n * sizeof(int));
for (int i = 0;i < n; i )
{
scanf("%d",&size);
arr = (int*)malloc(size * sizeof(int));
frr = (int*)malloc(size * sizeof(int));
for(int j = 0; j < size; j )
{
scanf("%d",arr j);
*(frr j) = -1;
}
if(size >= 3)
{
for (g = 0; g < size ; g )
{
count=1;
for(s = g 1; s < size;s )
{
if(*(arr g) == *(arr s))
{
count ;
*(frr s) = 0;
}
}
if(*(frr g) != 0 )
{
*(frr g) = count;
}
if(*(frr g) >= 3)
{
*(ptr i) = *(arr g);
}else
{
*(ptr i) = -1;
}
}
}else
{
*(ptr i) = -1;
}
free(arr);
free(frr);
}
for(int j = 0;j<n;j )
{
printf("%d\n",*(ptr j));
}
}
uj5u.com熱心網友回復:
問題是您為陣列的每個元素設定為*(ptr i)。-1這意味著未重復三次的陣列后面的元素將重置 *(ptr i)為-1.
改變這個
if(*(frr g) >= 3)
{
*(ptr i) = *(arr g);
}
else
{
*(ptr i) = -1;
}
對此
if(*(ptr i) == -1 && *(frr g) >= 3)
{
*(ptr i) = *(arr g);
}
并在開始時添加這個
ptr = (int*)malloc(n * sizeof(int));
for (int i = 0;i < n; i )
{
*(ptr i) = -1;
但正如評論中已經說過的那樣,您不需要ptr陣列或frr陣列。您一次只運行一項測驗,因此無需在列印任何測驗結果之前保留所有測驗結果。你只需要保存你正在測驗的當前元素的頻率,所以你也不需要一個陣列。
并使您的代碼可讀,更改*(arr g)為arr[g]. 它們的作業原理完全相同。
uj5u.com熱心網友回復:
對于初學者來說,這個陣列分配
ptr = (int*)malloc(n * sizeof(int));
沒有意義。對于每個給定的數字序列,您可以立即輸出該序列是否包含三個相等的元素,而無需將此資訊存盤在分配的陣列中。
也分配這個輔助陣列
frr = (int*)malloc(size * sizeof(int));
使代碼不安全且效率低下。
如果找到已經出現 3 次的元素,則遍歷陣列是沒有意義的。
否則此代碼段
if(*(frr g) >= 3)
{
*(ptr i) = *(arr g);
}else
{
*(ptr i) = -1;
}
對于存在于陣列尾部的元素,arr可能會錯誤地將值設定ptr[i]為-1盡管早期已經找到了出現三次的前一個元素。
如果沒有指標指向的冗余陣列ptr,frr程式可以如下所示
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
size_t t = 0;
scanf( "%zu", &t );
while (t--)
{
size_t n = 0;
scanf( "%zu", &n );
int result = -1;
if (n)
{
int *a = malloc( n * sizeof( int ) );
for (size_t i = 0; i < n; i )
{
scanf( "%d", a i );
}
for (size_t i = 2; result == -1 && i < n; i )
{
int count = 1;
for (size_t j = i; count != 3 && j-- != 0; )
{
if (a[j] == a[i]) count;
}
if (count == 3) result = a[i];
}
free( a );
}
printf( "%d\n", result );
}
}
uj5u.com熱心網友回復:
我會以完全不同的方式處理這個問題。由于元素的范圍沒有明確的界限,因此管理頻率表有點棘手。但是每個測驗陣列中的最大元素數量非常少,因此可行
- 宣告一個足夠大的陣列以容納任何測驗用例的所有元素
- 對于每個測驗用例,
- 將所有元素讀入(一個)陣列
- 對陣列進行排序(
qsort(),或滾動您自己的插入或選擇排序) - 掃描已排序的陣列以輕松檢測和報告至少出現三次的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495150.html
