2 条题解

  • 1
    @ 2026-6-2 22:56:07

    注意到

    每个字符只出现一次而且还不能改变顺序

    那么问题来了

    那咱们遍历数组

    用一个哈希存储这个数字有没有出现过

    如果出现过就跳过,没有就加入到ans数组里

    最后输出ans数组即可

    C++

    #define AC ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    #define ll long long
    #define vec vector
    ll n;
    int main()
    {
        AC;
        cin>>n;
        unordered_set<ll>hx;
        vec<ll>ans;
        for(int i=0;i<n;++i)
        {
            ll x; cin>>x;
            if(hx.find(x)==hx.end())
            {
                hx.insert(x);
                ans.push_back(x);
            }
        }
        for(int i=0;i<(int) ans.size();++i) cout<<ans[i]<<' ';
        return 0;
    }
    

    Python

    import sys
    arr=list(map(int,sys.stdin.read().split()))
    n=arr[0]
    s=set()
    res=[]
    for i in range(1,n+1):
        x=arr[i]
        if x not in s:
            s.add(x)
            res.append(str(x))
    print(' '.join(res))
    
    • 0
      @ 2026-6-5 8:53:37

      注意到本题中, aia_i 的范围为 1ai1001 \leq a_i \leq 100, 因此我们可以直接开一个长度为100的数组,修改和查询对应下标内容时间复杂度为O(1)O(1),

      遍历原数组复杂度为O(n)O(n)

      综合总复杂度为O(n)O(n)

      代码示例:

      n = int(input())
      appear = [0 for i in range(101)]
      arr = list(map(int,input().split()))
      ans = []
      for i in arr:
          if appear[i] == 0:
              ans.append(i)
              appear[i] = 1
      print(*ans)
      

      这个方法仅限用于ai106a_i \leq 10^6 情况下,更大情况请参考隔壁破寻负的题解

      另外,因此题n足够小,故循环嵌套检查的方法也可以通过本题

      • 1

      信息

      ID
      1168
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      递交数
      16
      已通过
      9
      上传者