C언어 배열 중복 숫자 개수 - ceon-eo baeyeol jungbog susja gaesu

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <stdio.h>

int main() 

{

int count = 0, input = 0;

int ary[10= {0123443256};

printf("Input a number : ");

scanf("%d"&input);

for(int i = 0; i < sizeof(ary); i++) {

if (input == ary[i]) {

count++;

// end of if

// end of for

printf("The number of the same number which you input (%d) in Array ary is %d \n", input, count - 1);

cs

⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️

중복을 포함하는 어레이된 정수 어레이이 주어지면 주어진 숫자의 발생 횟수를 계산합니다. 어레이에서 요소를 찾을 수 없는 경우 해당 요소도 보고합니다.

예를 들어,

Input:  nums[] = [2, 5, 5, 5, 6, 6, 8, 9, 9, 9]
target = 5

  Output: Target 5 occurs 3 times

    Input:  nums[] = [2, 5, 5, 5, 6, 6, 8, 9, 9, 9]
target = 6

  Output: Target 6 occurs 2 times

이 문제를 연습

간단한 해결책은 어레이에서 선형 검색을 실행하고 주어진 요소의 발생 횟수를 계산하는 것입니다. 이 접근 방식의 문제는 최악의 시간 복잡도가 O(n), 어디 n 입력의 크기입니다. 이 솔루션은 또한 입력이 정렬된다는 사실을 이용하지 않습니다.

또 다른 솔루션은 이진 검색 주어진 어레이된 어레이에서 주어진 숫자가 나타나는 인덱스를 찾습니다. target. 어레이이 어레이되기 때문에 모든 발생 target 인접하게 됩니다. 따라서 선형 스캔을 실행하여 target 찾은 인덱스의 왼쪽과 오른쪽. 이 솔루션의 최악의 시간 복잡도는 다음과 같습니다. O(n). 최악의 경우는 모든 어레이 요소가 주어진 숫자와 같을 때 발생합니다.

 
우리는 이 문제를 쉽게 해결할 수 있습니다. O(log(n)) 시간 이진 검색 알고리즘 수정. 아이디어는 주어진 숫자의 첫 번째와 마지막 발생의 인덱스를 찾고 두 인덱스의 차이보다 하나를 더 반환하는 것입니다. 우리는 이미 방법과 숫자의 처음과 마지막 항목 찾기 안에 O(log(n)) 이전 포스트의 시간.

알고리즘은 C, Java 및 Python에서 다음과 같이 구현할 수 있습니다.

C


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

#include <stdio.h>

// 주어진 숫자의 첫 번째 또는 마지막 발생을 찾는 함수

// 어레이된 정수 어레이. `searchFirst`가 true이면 반환

// 숫자의 첫 번째 발생; 그렇지 않으면 마지막 항목을 반환합니다.

intbinarySearch(int nums[],intn,int target,intsearchFirst)

{

    // 검색 공간은 nums[low…high]입니다.

    intlow=0,high= n-1;

    // 결과를 -1로 초기화

    int result=-1;

    // 검색 공간이 소진될 때까지 루프

    while(low<=high)

    {

        // 검색 공간에서 중간 값을 찾아 대상과 비교합니다.

        intmid=(low +high)/2;

        // 타겟이 발견되면 결과 업데이트

        if(target==nums[mid])

        {

            result=mid;

            // 왼쪽으로 계속 검색(하위 인덱스)

            if(searchFirst){

                high=mid-1;

            }

            // 오른쪽으로 계속 검색(높은 인덱스)

            else{

                low=mid+1;

            }

        }

        // 타겟이 중간 요소보다 작으면 오른쪽 절반을 버립니다.

        else if(target<nums[mid]) {

            high=mid-1;

        }

        // 타겟이 중간 요소보다 크면 왼쪽 절반을 버립니다.

        else{

            low=mid+1;

        }

    }

    // 찾은 인덱스를 반환하거나 요소가 없으면 -1을 반환합니다.

    return result;

}

intmain(void)

{

    intnums[]={2, 5,5,5,6, 6,8,9,9, 9};

    inttarget=5;

    intn= sizeof(nums)/sizeof(nums[0]);

    // 첫 번째 발생에 대해 값 1을 전달합니다.

    intfirst= binarySearch(nums,n,target, 1);

    // 마지막 발생에 대해 값 0을 전달합니다.

    intlast =binarySearch(nums,n,target, 0);

    intcount=last -first+1;

    if (first!=-1){

        printf("Element %d occurs %d times",target,count);

    }

    else{

        printf("Element not found in the array");

    }

    return0;

}

다운로드  코드 실행

결과:

Element 5 occurs 3 times

Java


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

classMain

{

    // 주어진 숫자의 첫 번째 또는 마지막 발생을 찾는 함수

    // 어레이된 정수 어레이. `searchFirst`가 true이면 반환

    // 숫자의 첫 번째 발생; 그렇지 않으면 마지막 항목을 반환합니다.

    publicstaticint binarySearch(int[]nums,int target,booleansearchFirst)

    {

        // 검색 공간은 nums[left… right]

        intleft=0;

        intright=nums.length- 1;

        // 결과를 -1로 초기화

        intresult =-1;

        // 검색 공간이 소진될 때까지 루프

        while (left<=right)

        {

            // 검색 공간에서 중간 값을 찾아 대상과 비교합니다.

            intmid=(left +right)/2;

            // 타겟이 발견되면 결과 업데이트

            if(target== nums[mid])

            {

                result=mid;

                // 왼쪽으로 계속 검색(하위 인덱스)

                if(searchFirst){

                    right =mid-1;

                }

                // 오른쪽으로 계속 검색(높은 인덱스)

                else{

                    left=mid+1;

                }

            }

            // 타겟이 중간 요소보다 작으면 오른쪽 절반을 버립니다.

            elseif(target< nums[mid]){

                right =mid-1;

            }

            // 타겟이 중간 요소보다 크면 왼쪽 절반을 버립니다.

            else{

                left =mid+1;

            }

        }

        // 찾은 인덱스를 반환하거나 요소가 없으면 -1을 반환합니다.

        returnresult;

    }

    publicstaticvoid main(String[]args)

    {

        int[]nums={2, 5,5,5,6, 6,8,9,9, 9};

        inttarget= 5;

        // 첫 번째 항목에 대해 true를 전달합니다.

        intfirst =binarySearch(nums,target,true);

        // 마지막 발생에 대해 false를 전달합니다.

        intlast=binarySearch(nums,target,false);

        intcount=last-first +1;

        if(first!= -1){

            System.out.println("Element "+target +" occurs "+count+" times");

        }

        else{

            System.out.println("Element not found in the array");

        }

    }

}

다운로드  코드 실행

결과:

Element 5 occurs 3 times

Python


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

# 주어진 숫자의 첫 번째 또는 마지막 발생을 찾는 함수

# 정렬된 정수 목록입니다. `searchFirst`가 true이면 반환

# 숫자의 첫 번째 발생; 그렇지 않으면 마지막 항목을 반환합니다.

defbinarySearch(nums, target,searchFirst):

    # 검색 공간은 nums[left…right]입니다.

    (left,right)=(0, len(nums)-1)

    #는 결과를 -1로 초기화합니다.

    result=-1

    # 검색 공간이 소진될 때까지 # 루프

    while left<=right:

        # 검색 공간에서 중간값을 찾아 타겟과 비교

        mid=(left+right) //2

        # 대상이 발견되면 결과 업데이트

        if target==nums[mid]:

            result=mid

            # 왼쪽(하위 인덱스)으로 계속 검색

            ifsearchFirst:

                right= mid-1

            # 오른쪽으로 계속 검색(높은 인덱스)

            else:

                left=mid+ 1

        # 대상이 중간 요소보다 작으면 오른쪽 절반을 버립니다.

        eliftarget< nums[mid]:

            right= mid-1

        # 대상이 중간 요소보다 크면 왼쪽 절반을 버립니다.

        else:

            left=mid+1

    #는 찾은 인덱스를 반환하거나 요소가 없으면 -1을 반환합니다.

    returnresult

if__name__== '__main__':

    nums=[2, 5,5,5,6, 6,8,9,9, 9]

    target=5

    first =binarySearch(nums,target, True)        #는 첫 번째 발생에 대해 true를 통과합니다.

    last= binarySearch(nums,target,False)        #는 마지막 발생에 대해 false를 전달합니다.

    count=last-first +1

    iffirst!= -1:

        print(f'Element {target} occurs {count} times')

    else:

        print('Element found not in the list')

다운로드  코드 실행

결과:

Element 5 occurs 3 times

위 솔루션의 시간 복잡도는 O(log(n)) 추가 공간이 필요하지 않습니다. n 입력의 크기입니다.

 
참조:

읽어 주셔서 감사합니다.

우리의 온라인 컴파일러 C, C++, Java, Python, JavaScript, C#, PHP 및 기타 널리 사용되는 프로그래밍 언어를 사용하여 주석에 코드를 게시합니다.

우리처럼? 우리를 친구에게 소개하고 우리가 성장할 수 있도록 도와주세요. 행복한 코딩 :)


Toplist

최신 우편물

태그