Як напісаць функцыю, якая вяртае ісціну, калі кожнае цэлы лік у масіве адрозніваецца?

Я павінен напісаць функцыю, якая вяртае ісціну, калі кожнае цэлы лік у масіве з'яўляецца унікальным (па-рознаму). Такім чынам, я паспрабаваў выпраўленне маёй для завес/My, калі заяву і я паспрабаваў запусціць тэсты, якія я напісаў. Але, тэст на радок з цэлым лікам з'яўляецца некалькі разоў да гэтага часу не ўдаецца. Я разгледзеў мой код, але я да гэтага часу не магу знайсці праблему.

#include "in.h"

int in(int input[], int size)
{
   for (int i = 0; i < size - 1; i++)
   {
      for (int j = i + 1; j < size; j++)
      {
         if (input[i] == input[j])
         {
            return 0;
         }
      }
   }

   return 1;
}

Вось мае тэставыя прыклады:

#include "in.h"
#include "checkit.h"

void in_tests(void)
{
   int input[3] = {2, 4, 5};
   int answer;

   answer = in(input, 3);
   checkit_int(answer, 1);

   int input1[4] = {1, 3, 4, 1};
   int answer1;

   answer1 = in(input1, 4);
   checkit_int(answer, 0);
}

int main()
{
   in_tests();

   return 0;
}
0
гэтак жа, як пабочны пытанне, большасць прыкладаў у адказах ніжэй, кажуць, што яны O (n2) складанасць не з'яўляюцца. што яны? ці яны?
дададзена аўтар matt, крыніца
Як наконт сартавання масіва, а затым параўнаць паслядоўныя элементы.
дададзена аўтар OldProgrammer, крыніца
вашы checkit_int званкі няправыя вы павінны быць прапусканнем памеру масіва ў якасці другога параметру ня 1 або 0 .. не ведаюць, што гэта значыць
дададзена аўтар Ahmed Masud, крыніца
ваша функцыя назад; гэта паказвае на тое, ці ёсць пара, якая з розных значэнняў.
дададзена аўтар muhmuhten, крыніца
О, не, я функцыя называецца "в" з прыведзенага вышэй кода. І я прызначыў цэлалікавых зменную «адказ» на вяртаецца значэнне функцыі. (Функцыя вяртае цэлы лік). І ў маім функцыі, калі б гэта было праўдай, то вяртала 1, і калі яно было ілжывым, ён вярнуўся 0. Такім чынам, я параўнаў «адказ» (цэлую зменную я прызначаную функцыю) з тым, што я чакаў, 1 або 0.
дададзена аўтар Karen, крыніца
У маім класе, мы яшчэ не навучыліся, як сартаваць масіў. Так што я не думаю, што я магу зрабіць гэта. :(
дададзена аўтар Karen, крыніца

7 адказы

без сартавання, ўшчыльняльнае (п 2 ):

<�Моцны> J пачынаецца з + 1. </Моцны>

int IsDiff(int array[], int count)
{
    int i,j;
    for (i=0; i
3
дададзена
@Karen так, там была памылка, адрэдагаваны.
дададзена аўтар vvy, крыніца
@Karen вашага другога checkit_int (адказ, 0) варта checkit_int (answer1, 0)
дададзена аўтар vvy, крыніца
Вы маеце на ўвазе масіў [I] == масіў [J]?
дададзена аўтар Karen, крыніца
Так што я рэдагаваў свой код, каб выправіць для завес, але тэсты для праграмы па-ранейшаму церпяць няўдачу. :( У прыватнасці, калі масіў цэлых лікаў мае значэнне, якія з'яўляюцца больш за адзін раз. Што можа быць не так з маім кодам ??
дададзена аўтар Karen, крыніца
Вау ... нядбайная памылка, я думаю, што гэта праблема, ДЗЯКУЙ! :)
дададзена аўтар Karen, крыніца

Калі прастора не з'яўляецца праблемай, то мы можам мець рашэнне O (N), выкарыстоўваючы хэш-табліцу. Пачатак захоўвання кожнага элемента масіва ў хэш-табліцы. Пры ўстаўцы элементаў, зрабіць праверку, каб убачыць, калі яна ўжо прысутнічае ў хэш-табліцы (якая займае O (1) раз.) Калі элемент ўжо прысутнічае, а затым вяртаць хлусня неадкладна, яшчэ ітэрацыю да канца масіва і вяртае ісціну.

2
дададзена
але як наконт унутранай складанасці Хэш званкоў?
дададзена аўтар matt, крыніца

на самай справе, то не чаму ваша функцыя не працуе. асноўная прычына ў тым, што ў цяперашні час вы правяраеце, калі любая пара DONT матч, які быў бы вялікім, калі вы хочаце, каб убачыць, калі ўсе элементы супадаюць, але вы хочаце зрабіць наадварот, так што вы хочаце, каб праверыць адваротнае, калі любая пара ДЕЛАЕТ матч. таму спачатку змяніць свой, калі б

if(input[i] == input[j]) return false;

калі адна пара роўная, то вы ведаеце, што ваш тэст ўжо не атрымалася, так што няма неабходнасці правяраць пакінутыя пары, проста вяртае хлусня там і тады.

адзінае, што трэба зрабіць, гэта разабрацца ў сваіх завес, так што вы ітэрацыю толькі па кожнай пары адзін раз і не параўнаць значэнне з яго ўласнай. каб зрабіць гэта змяніць для завесы быць:

for(int i =0; i

Затым, калі вы зробіце гэта да канца функцыі, гэта не азначае, што ніякая пара, як супадаюць, так што проста вяртае ісціну;

1
дададзена

Вось мая спроба на яго (вельмі проста і неэфектыўна, хоць):

#include 

int uniq_int(int arr [], int size)
{        
    int i, j;

    for (i = 0; i < size; i++) 
        for (j = i + 1; j < size; j++)
            if (arr[i] == arr[j])
                return 0;

    return 1;
}


int main()
{
    int arr [] = {1, 2, 4, 3, 5};

    (uniq_int(arr, 5)) ? printf("Unique!\n") : printf("Not...\n");
    /* the above can be written more traditionally like this:
    if (uniq_int(arr, 5) != 0)
    {
        printf("Unique!\n");
    }
    else
    {
        printf("Not...\n");
    }
    */

    return 0;
}

Гэта будзе параўнаць кожны элемент масіва ў адносінах да астатніх, пачынаючы з першага і ня параўноўваючы яе ад наступнага і гэтак далей да канца ўнутранага цыклу.

Тады мы пачынаем знешні цыкл зноў, але на гэты раз мы параўнаем другі элемент масіва супраць іх пасля яго.

Як толькі будзе знойдзена супадзенне функцыя будзе вяртаць і не будзе неабходнасці параўноўваць іншыя элементы. У адваротным выпадку знешні контур будзе працягвацца да апошняга элемента і як толькі гэта будзе дасягнута гэта прывядзе да выхаду і вяртаць 1, гэта значыць кожны член з'яўляецца унікальным.

Ён мае складанасць O (N ^ 2) як мноства апрацоўваюцца двойчы для кожнага члена ў горшым выпадку.

0
дададзена

Вы вельмі блізкія, паспрабуйце наступнае:

#include "in.h"

int in(int input[], int size)
{
   int answer = 1;

   for (int i = 0; i < size-1; i++)
   {  
      for (int j = i+1; j < size; j++)  //check everything above your current 
                                        //value because you have already checked 
                                        //below it.
      {
         if (input[i] == input[j])
         {
            answer = 0;                  //If any are not unique you
            break;                       //should exit immediately to save time

         }
      }
      if (answer == 0)
          break
   }
   return answer;
}
0
дададзена

Думаючы пра праблему

let's say you have an array like this: int array[] = { 3, 1, 4, 8, 2, 6, 7, 7, 9, 6 };

калі вы пачынаеце з першым элементам вам неабходна параўнаць з астатнімі элементамі ў наборы; так 3 патрэбнасці ў параўнанні з 1, 4, 3 ... і г.д.

калі 3 унікальны вам трэба прама цяпер перайсці да 1, і паглядзець на астатнія элементы, але ў наступны раз вам не трэба турбавацца аб 3; так што вашыя значэнне пры разглядзе (назавем гэта V) павінен быць кожны з, масіва [0] на масіў [N-1] дзе N гэта памер <�кода > масіў (у нашым выпадку 10);

Але калі ўявіць сябе ў сярэдзіне масіва, мы заўважаем, што мы ўжо ў параўнанні папярэднія элементы да бягучага элементу, калі папярэдні элемент быў значэнне <�ет> пры разглядзе . Такім чынам, мы можам ігнараваць любыя элементы «за» нас; што азначае параўнанне павінна пачаць кожны раз з індэксам бягучага значэння разгляданага (назовёй, што к) і параўнаць яго значэнне, пачынаючы з наступным індэксам і збіраецца да канца масіва; таму псеўда-код для нашага масіва 10 гэта будзе выглядаць наступным чынам:

int is_a_set(int array[]) 
{
   for ( k = 0; k < 10-1 ; k++ ) { /* value under consideration */
      v = array[k]; 
      for ( m = k+1 ; m < 10; m++ ) { /* compared to the remaining array starting
                                     * starting from the next element */
           if ( v == array[m] ) { /* we found a value that matches, no need to 
                                   * to continue going, we can return from this function
                                   */
                 return true; 
           }
      }
   }
   return false;
}

Цяпер вы можаце выкарыстоўваць нешта накшталт:

if ( is_a_set(my_array) ) {

}

Вы павінны быць у стане выкарыстаць гэта, каб зразумець астатнюю частку кода з :-)

Заўвага: калекцыя з унікальнымі элементамі, называецца набор так я назваў функцыю is_a_set

Намёкам: пераўтварыць памер масіва (10) у якасці параметру або зменнай некаторага віду

0
дададзена

O (N ^ 2), а таксама .. але я дадаў гэтую функцыю, што робіць код больш зразумелым ...

int unique(int input[], int value,int size){
    int times=0;
    for (int i = 0; i < size; i++)
    {
        if(input[i]==value){
             times++;
             if(times==2)
                return 0;
        }
    }  
    return 1;
}

int in(int input[], int size)
{
   int x, answer;

   for (int i = 0; i < size; i++)
   {  
      if(!unique(input,input[i],size))
          return 0;
   }
   return 1;
}
0
дададзена
C мае Bool , але вы павінны ўключаць stdbool.h .
дададзена аўтар R.., крыніца
Вы павінны растлумачыць свой адказ, так што ёсць нейкая каштоўнасць адукацыі тут. У адваротным выпадку, гэта проста капіяваць/ўставіць адказ на хатняе заданне (які выразна пазначаныя як такія ў каментарах да першапачатковага пытанні). @AhmedMasud: Пытанне плакат паказаў, што сартаванне не было магчымасці, бо яны не пакрылі, што ў класе яшчэ. Глядзіце каментары да першапачатковага пытанні.
дададзена аўтар Ken White, крыніца
пісаць адказ з :)
дададзена аўтар Ahmed Masud, крыніца
так, гэта лепш, каб ператварыць гэта ў код C, а не C ++, і гэта таксама адчувае сябе крыху павольна, таму што, як вы не бурбалка сартавання гэта
дададзена аўтар Ahmed Masud, крыніца
Там здаецца, няма BOOL ў C. вам трэба вярнуць Int замест гэтага?
дададзена аўтар taocp, крыніца
там вы ідзяце: B
дададзена аўтар Sebastian Breit, крыніца
Я думаю, што імя функцыі дапамагае зразумець, што ён робіць. Калі пытаючы цікавіцца, што гэта будзе лёгка для яго, каб зразумець. Я не думаю, што гэта мае патрэбу ў тлумачэнні (я выказаць здагадку, што які пытаецца разумее код, ён пісаў)
дададзена аўтар Sebastian Breit, крыніца