博主实在是太菜了,加了很多无用的判断,只为给新手提供一种便于理解的思路QAQ
题目如下:
题目大意:t组测试数据,每次输入一个n代表接下来输入数字的个数.然后将进行判断.
输出情况:输出只出现过一次的最小值的下标+1(或者理解为第几个输入进去的).如果没有满足条件的,输出-1.
(举例:
INPUT
1
5
2 3 2 4 2
OUTPUT
2
)
解析例子:输入测试数据1个,并且跟随者5个数字,为2 3 2 4 2.显然,出现过最小次数的是3与4,而3<4.所以最后将输出3的下标——2
解题思路:
step1:每次存数组的时候存两个,即输入a[i]的时候令b[i] = a[i];
step2:对a[i]用sort快排,提前设置一个min为1000005,保证比输入的数的最大值还大,然后只在确定能有答案时才改变这个值
step3:判断n的个数,如果为1,则输出1;如果不为1,判断i在数组中的位置,不为末尾则需不等于左右两个数,为首尾则省略一个判断条件(此处判断过多且累赘,可以自行裁剪) 若找到符合条件的,把符合条件的a[i]赋值给min
step4:如果min还是1000005没有改变,则没有找到合适对象,输出-1
其他情况,则从1开始遍历数组b,寻找令min = b[i]成立的i,输出i(即位置)
本题做法多样,在此只选择了一种思路比较好理解的但是实属有些累赘复杂的方法,仅供参考.
AC代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[2000005];
int b[2000005];
int main()
{
int t,n,i,min = 1000005;
cin >> t;
while ( t-- )
{
cin >> n;
for( i = 1; i <= n; i++)
{
cin >> a[i];
b[i] = a[i];
}
sort(a + 1,a + n + 1);
min = 1000005;
for ( i= 1; i <= n; i++)
{
if(n == 1) min = a[i];
else
{
if( i == 1)
{
if(a[i] != a[i+1])
{
min = a[i];
break;
}
else continue;
}
else if ( i != n )
{
if( a[i] != a[i-1] && a[i] != a[i+1])
{
min = a[i];
break;
}
else continue;
}
else if (i == n)
{
if(a[i] != a[i-1])
{
min = a[i];
break;
}
}
}
}
if( min ==1000005) cout << "-1" << endl;
else
{
for( i = 1; i <= n; i++)
{
if(min == b[i]) break;
}
cout << i <<endl;
}
}
}