5-順序表查詢及插入問題

outer_star發表於2018-08-04

給你一個順序表a[],請找到

1-0 第一個x出現的位置,如果不存在,輸出-1

1-1 前兩個x出現的位置,如果只存在一個x,輸出他的位置,如果一個都不存在,輸出-1

1-2 查詢最小/大元素所在的位置,如果多個最小/大值,輸出第一個

1-3 查詢次大/小值所在的位置。

2-0向順序表a[]的第i個(下標從0開始)位置前插入一個元素x。如果插入位置太小輸出-1,太大輸出1,合法輸出0並完成插入


程式碼1:(自己寫的):

#include <stdio.h>
const int maxn = 100;

int finds(int a[],int n,int x)
{
    int couter=0;
    for(int i=1;i<=n;i++)
    {
        if((a[i]==x))
        {
            return i;
        }
    }
    return -1;
}

void finds1(int a[],int n,int x)
{
    int couter=0;
    for(int i=1;i<=n;i++)
    {
        if((a[i]==x)&&(couter<2))
        {
            printf("%d ",i);
            couter++;
        }
    }
    if(!couter)
    printf("-1");
}

int finds2(int a[],int n)
{
    int site=1;
    a[0]=a[1];      //設a[0]為最大元素,每個元素跟a[0]進行比較
    for(int i=2;i<=n;i++)
    {
        if(a[0]<a[i])
        {
            a[0]=a[i];
            site=i;
        }
    }
    return site;
}

//max1和max2的值需要先做一個比較,以下程式碼未比較,待改正
/*int finds3(int a[],int n)
{
    int b[3];
    int max1=1,max2=2;
    b[1]=a[1];
    for(int i=2;i<=n;i++)
    {
        if(a[i]>b[1])
        {
            b[2]=b[1];
            max2=max1;
            b[1]=a[i];
            max1=i;
        }
        else if(a[i]<b[1])
        {
            if(a[i]>b[2])
            {
                b[2]=a[i];
                max2=i;
            }
        }
    }
    return max2;
}
*/

int main()
{
    int a[maxn];
    int n,x;
    scanf("%d %d",&n,&x);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }

//    int ret=finds(a,n,x);
//    printf("%d\n",ret);

//    finds1(a,n,x);

//    int maxs = finds2(a,n);
//    printf("%d",maxs);

    printf("%d",finds3(a,n));
    return 0;
}

程式碼2:(西交wrong):

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>

using namespace std;
const int maxn = 100000;
typedef pair<int,int> P;
int findx(int a[],int n,int x)
{
    for(int i=1;i<=n;i++)
        if(a[i]==x) return i;
    return -1;
}
void findxy(int a[],int n,int x,int &x1,int &x2)
{
    bool cot=0;//當前出現了0個x
    for(int i=1;i<=n;i++)
        if(a[i]==x)
            if(cot==0) {x1=i;cot=1;}
            else
                if(cot==1) {x2=i;return ;}
}
int findmax(int a[],int n)
{
    int maxpos=1,maxnum=a[1];
    for(int i=2;i<=n;i++)
        if(a[i]>maxnum) {maxnum=a[i];maxpos=i;}
    return maxpos;
}
int findmax2(int a[],int n)
{
    //n
    int max1=max(a[1],a[2]),max2=min(a[1],a[2]),pos1,pos2;
    if(a[1]>a[2]) {pos1=1;pos2=2;}
    else {pos1=2;pos2=1;}

    for(int i=3;i<=n;i++)
    {
        if(a[i]>max1) {max2=max1;pos2=pos1;max1=a[i];pos1=i;}
        else
            if(a[i]==max1) continue;
            else {
                if(a[i]>max2){
                    pos2=i;
                    max2=a[i];
                }
            }
    }
    return pos2;
}
int insertList(int a[],int th,int n,int x)
{
    if(th<1) return -1;
    if(th>n) return 1;
    for(int i=n;i>=th;i--)
        a[i+1]=a[i];
    a[th]=x;
    return 0;
}
int main()
{
    int a[maxn];
    //1.0 第一個x出現的位置,如果不存在,輸出-1
    int n,x,y;
    cin>>n>>x>>y;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    //int res=findx(a,n,x);
    //printf("%d\n",res);
    /*
    int x1=-1,x2=-1;
    findxy(a,n,x,x1,x2);
    if(x1==-1) printf("-1\n");
    else
        if(x2!=-1) printf("%d %d\n",x1,x2);
        else printf("%d\n",x1);
   */
    //printf("%d\n",findmax2(a,n));
    cout<<insertList(a,x+1,n,y)<<endl;
    for(int i=1;i<=n+1;i++)
        cout<<a[i]<<" ";
    cout<<endl;
   return 0;
}

(感謝西交wrong學長提供以上題目練習)

相關文章