【问题标题】:Adding an element in between of an array without affecting index traverse在数组之间添加元素而不影响索引遍历
【发布时间】:2017-03-17 07:50:02
【问题描述】:

我需要一个有效的解决方案(空间+时间)来解决以下问题,

当前代码

#define MAX_CHAR 26

char alphabet[MAX_CHAR] = 
{
   'A',
   'B',
   'C',
   'D',
   'E',
   ...
   ...
   'Z'
}

print_first_alphabet_number (Str)
{
   for (i=0; i < MAX_CHAR; i++)
   {
     if (Str[0] == start_letter[i])
     {
        printf ("%d", i);
        return;
     }
   }
    return;
}

示例 IO

Apple -> 0
Door  -> 3
Zoo   -> 25

修改后的代码

#define MAX_CHAR 27

char alphabet[MAX_CHAR] = 
{
   'A',
   'B',
   '@',
   'C',
   'D',
   'E',
   ...
   ...
   'Z'
}

期待

print_first_alphabet_number 应修改为与样本 IO 相同的结果。

提前谢谢..

编辑

这不是确切的问题,这只是一个例子..

【问题讨论】:

  • 字母之间的“@”字符有什么意义吗?为什么不把它放在最后呢?
  • 你真正想做什么?

标签: c arrays algorithm loops optimization


【解决方案1】:
#define MAX_CHAR 27

char alphabet[MAX_CHAR] = 
{
   'A',
   'B',
   '@',
   'C',
   'D',
   'E',
   ...
   ...
   'Z'
}

print_first_alphabet_number (Str)
{
   for (i=0; i < MAX_CHAR; i++)
   {
     if (Str[0] == start_letter[i])
     {
        printf ("%d", start_letter[i] - 'A');
        return;
     }
   }
    return;
}

编辑

或者正如@nico-schertler 建议的那样,如果您只需要打印与字母顺序或大写字母相同的整数,则无需任何字符数组和循环即可实现此目的。

printf ("%d", Str[0] - 'A');

【讨论】:

  • 你不需要循环。就printf ("%d", Str[0] - 'A');
  • 我只是尽量保持代码和以前一样
【解决方案2】:

很难理解你在做什么,你只想要 alpha 值的索引?

#include <stdio.h>
#include <ctype.h>

#define MAX_CHAR 27

char alphabet[] = 
{
   'A',
   'B',
   '@',
   'C',
   'D',
   'E',
   ...
   'Z'
};

void print_first_alphabet_number(char * Str)
{
    unsigned int ret = 0;
    for (unsigned int i=0; i < MAX_CHAR; i++)
    {
        if (Str[0] == alphabet[i])
        {
            printf("%d\n", ret);
            return;
        }
        if(isalpha(alphabet[i])) ret++;
    }
    return;
}

int main()
{
    print_first_alphabet_number("Door");
    return 0;
}

【讨论】:

    【解决方案3】:

    假设:你不能通过值来区分插入的元素,只能通过索引来区分,所以这是输入。在更多插入时,应组织一组插入的偏移量。

    #include <stdio.h>
    
    int main()
    {
        int idx;
        char abc[] = "AB@CDEFGHIJKLMNOPQRSTUVWXYZ";
        int skip = 2; /* index to be skipped */
        int num_skip = 0;
        int size = sizeof(abc)/sizeof(abc[0]);
        char ch;
        printf( "char [A-Z]: " );
        (void)scanf( "%c", &ch );
        for( idx = 0; idx < size; ++idx )
        {
            if( skip == idx ) { ++num_skip; }
            if( ch == abc[idx] )
            {
                printf( "%d\n", idx - num_skip );
                idx = size;
            }
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2012-09-29
      相关资源
      最近更新 更多