【问题标题】:How to check first letter of one string with last letter of another string inside of same char array如何检查一个字符串的第一个字母和同一个字符数组内另一个字符串的最后一个字母
【发布时间】:2018-11-12 15:47:12
【问题描述】:

如何完成函数 canArrangeWords() ?

问题:给定一组单词,检查我们是否可以将它们排列在一个列表中,使得任何单词的最后一个字母和另一个单词的第一个字母相同。输入函数 canArrangeWords 应包含一个整数 num 和单词数组 arrnum 表示列表(1<=num<=100) 中的单词数。 arr 应包含由 'a' - 'z' 之间的小写字母组成的单词。如果单词可以以这种方式排列,则返回 1,如果不能,则返回 -1。

Input : 4  pot ten nice eye
output : 1
input : 3 fox owl pond 
output: -1

请帮我完成这个程序。 **

#include<stdio.h>
#include<string.h>
int canArrangewords(int,char [100][100]);


void main(){
    int n ,count=0 , i ; 
    char arrayS[100][100];
    scanf("%d",&n);
    for (i = 0; i < n; ++i)
    {
        scanf("%s",arrayS[i]);

    }

    for(i=0;i<n;i++)
    {
        printf("%s",arrayS[i]);
        printf("\n");

    }
    printf("%c\n",arrayS[2][4]);

    canArrangewords(n , arrayS);

}

int canArrangewords(int n,char arrayS[100][100]){


    int i , j ;
    for ( i = 0; i < n; i++)
    {
        for ( j = i+1 ; j < strlen(arrayS[j+1]); i++)
        {
            int flag = strlen(arrayS[j+1]) - 1;
            int temp = strcmp(arrayS[i][0],arrayS[j][flag]);



            }

        }


    }



}

【问题讨论】:

    标签: c arrays string function


    【解决方案1】:

    嗯,首先想想你能得到那个答案的方法。

    如果您只需要知道它们是否可以排列并且您不必自己这样做,您可以为每个字母 a-z 使用一个空的 int array[26] 数组。

    规则是在所有单词的所有第一个和最后一个字母中,只有两个可能出现奇数次 - 列表中第一个单词的第一个字母和列表中最后一个单词的最后一个字母,其余的必须出现偶数次。我会添加一个检查以确保这些字母也是小写的。祝你好运!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MINASCII 97
    #define LETTERS 26
    void UpdateArray(char letter, int* arr)
    {
    
      if(arr[letter - MINASCII] == 0)
      {
          ++arr[letter - MINASCII];
      }
      else
      {
         --arr[letter - MINASCII];/*for each second time same letter is seen reduce back to zero */
      }
    }
    int canArrangewords(int wordNum, char* wordArr[])
    {
      int arr[LETTERS] = {0};
      int i = 0;
      int count = 0 ;
      char first;
      char last;
      char* string;
      for (i= 0; i< wordNum; ++i)
      {
         string = wordArr[i];
         first = string[0];
         last = string[strlen(string)-1];
         UpdateArray(first, &arr[0]);
         UpdateArray(last, &arr[0]);
     }
    
      for(i = 0; i< LETTERS; ++i)
      {
        count+=arr[i];
      }
      if(count == 2 || count == 0)/*either once each or twice -see word1 example in main*/
      {
        return 1;
      }
      return -1;
    }
    
    
    int main()
    {
      int i = 0;
      char* words[] = {"pot", "ten", "nice", "eye"};
      char* words1[] = {"pot", "ten", "nip"};
      char* words2[] = {"fox", "owl", "pond"};
      i = canArrangewords(4,words);
      printf("%d\n", i);
      i = canArrangewords(3,words1);
      printf("%d\n", i);
      i = canArrangewords(3,words2);
      printf("%d\n", i);
      return 0;
     }
    

    【讨论】:

    • 感谢您的回答。你能解释一下你的这部分代码吗?我无法清楚地理解此功能在做什么。 if(arr[字母 - MINASCII] == 0) { ++arr[字母 - MINASCII]; } else { --arr[字母 - MINASCII]; }
    • 这个函数被设置为告诉我们某个字母是否被看到了奇数次。例如 - 对于字母“a”。 ascii val 是 97,所以我们转到数组 [in place[97-97],它是 arr[0](对于 b,它将是 arr[98-97]==arr[1])。现在 - 我们第一次得到 a - 数组将更新为 1。如果字母再次出现 - 我们将 arr[0] 重置为零的偶数次。如果我们得到 3 次 arr[0] 将是 1 并且 4 次将再次为零。
    【解决方案2】:

    将您的单词数组更改为指向单词的指针数组。然后你可以简单地交换指针。

    为了加快速度,而不是指向单词的指针,让它指向一个结构:

    struct WORD {
        char *firstchar;   // begin of word
        char *lastchar;    // last char of word
    } *words[100];         // array of 100 pointers to words
    

    读单词:

    char buf[100];
    for (i = 0; i < n; ++i)
    {
        scanf("%s",buf);
        int len= strlen(buf);
        words[i]= malloc(sizeof(struct WORDS));
        words[i]->firstchar= malloc(len+1);
        strcpy(words[i]->firstchar, buf);
        words[i]->lastchar= words[i]->firstchar + len-1;
    }
    

    现在比较和排序:

            if (*words[i]->lastchar == *words[j]->firstchar) {
                struct WORDS *tmp= words[i+1];
                words[i+1]= words[j];
                words[j]= tmp;
            }
    

    在循环中执行此操作,一种冒泡排序。我把它留给你。

    【讨论】:

      猜你喜欢
      • 2018-07-21
      • 1970-01-01
      • 2013-11-26
      • 2020-07-19
      • 2018-10-03
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多