zoukankan      html  css  js  c++  java
  • 杭电OJ BestCoder28期1001Missing number问题(小技巧偏移法)

    1.先描述一下问题:

    小yb有一个排列,但他不小心弄丢了其中的两个数字。现在他告诉你他现在手上还有哪些数字,需要你告诉他他丢了哪两个数字。
    输入描述
    有多组数据,第一行为数据组数T(T10)。
    对于每组数据,第一行为一个正整数n,表示yb现在手上有的数字个数。
    在接下来一行有n个整数,保证所有数字互不相同且合法。
    1n1,000
    输出描述
    对于每组数据,输出两个数字,为排列缺少的两个数字,小的在前。

    2.解题思路

    该问题可以用一个数组存储输入排列,然后用一个偏移指针处理每次输入数据移动的情况。(为了处理出现 1 3 这种序列的情况,需要在输入数据的末尾加入一个0
    具体的移动情况如下图所示:


    3.代码如下

      #include <stdio.h>
      #include <stdlib.h>

      #define MAX_NUM 1000 + 10

      int main()
      {
        int i,j,num_case,num_number,number[MAX_NUM];

        int offset = 0,count = 0; //偏移

        scanf("%d",&num_case);

        for( i = 1; i <= num_case; i++)
        {
          offset = 0;
          count = 0;
          scanf("%d",&num_number);
          for( j = 0; j < num_number; j++)
          {
            scanf("%d",&number[j]);
          }

          number[j] = 0; //处理当出现 1 3 这种排列的状况而使offset偏移溢出

          for( j = 0; j < num_number + 2; j++)
          {
            if(count >= 2)
            {
              break;
            }
            if( number[offset] == j + 1 )
            {
              offset++;
            }
            else
            {
              printf("%d ",j + 1);
              count++;
            }
          }
          printf(" ");
        }
      }

     
    我是一块砖,哪里需要往哪搬。
  • 相关阅读:
    算法(Algorithms)第4版 练习 1.3.4
    算法(Algorithms)第4版 练习 1.3.5
    算法(Algorithms)第4版 练习 1.3.6
    微服务迁移步骤建议
    xxxx interview问题解读与总结
    乐观锁与悲观锁——解决并发问题
    编码解码--三种常见字符编码简介:ASCII、Unicode和UTF-8
    编码解码--url编码解码
    分页缓存预加载算法
    Could not initialize class sun.awt.X11FontManager 异常问题
  • 原文地址:https://www.cnblogs.com/daimadebanyungong/p/4268228.html
Copyright © 2011-2022 走看看