首页 > 解决方案 > 在用户输入的多个名称中查找第一个重复的名称

问题描述

社工组织了一顿早餐。排队领取食物包的人很多。快速找出第一个重新出现在排队领取食品包的人。

给定

亚当、宾尼、索海尔、克里希纳、玛雅克、索海尔、亚当

输出应该是:

索海尔

我无法用c语言解决这个问题。
请问有人可以解释该怎么做吗?

这是我的代码:

#include<stdio.h>
int main()
{

    int n,i,j;
    char str[20][20]; 

    scanf("%d",&n); 
    for(i=0;i<n;i++)
    {
       scanf("%s",&str[i]);

    }


    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            if(str[i]==str[j]){
                printf("%s\n",str[i]);
                return 0;
            }
        }
    }

    return 0;
}

我没有得到任何输出。

标签: c

解决方案


它可以给你一些方向:

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

typedef struct PersonInfo
{
  char *name;
  int number;
} person_info;

void check(person_info arr[], size_t size);

int main()
{
  char *arr_debug[20] = {"Adam", "Binny", "Sohail", "Krishna", "Mayank", "Sohail", "Adam"};
  int i = 0;
  person_info arr[7];
  size_t size = sizeof(arr)/sizeof(arr[0]);
  person_info temp;

  for (i = 0; i < size; i++) {
    // scanf("%s", temp.name);
    temp.name = arr_debug[i];
    temp.number = i + 1; // start counting from 1
    arr[i] = temp;
  }

  check(arr, size);

  return 0;
}

void check(person_info arr[], size_t size) {
  char *temp_name;
  int nums[size]; // filled with 0s
  int num = 0;

  for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
      if (strcmp(arr[i].name, arr[j].name) == 0 && arr[i].number < arr[j].number) {
        nums[num] = arr[j].number;
        num++;
        //store the number of the person
      }
    }
  }


  //find the earliest occurence
  int earliest = nums[0];
  for (int i = 1; i < size; i++) {
    if (earliest > nums[i] && nums[i] != 0) {
      earliest = nums[i];
    }
  }

  //find the name associated to the number
  for (int i = 0; i < size; i++) {
    if (arr[i].number == earliest) {
      temp_name = arr[i].name;
      printf("%s \n", temp_name);
    }
  }
}

推荐阅读