Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับความถี่ทุกสมาชิกในอาเรย์ O(1) extra space และ O(n) time ใน C++


เราได้รับอาเรย์สมาชิกมีค่า 1 ถึง n บางตัวซ้ำ บางตัวหาย เป้าหมายคือหาความถี่ของทุกสมาชิกใน O(n) time และ O(1) extra space

อินพุต

Arr[] = {1, 2, 2, 3, 4, 4, 4, 5}

เอาต์พุต

1→1, 2→2, 3→1, 4→3, 5→5

คำอธิบาย − สมาชิกสูงสุดคือ 5 แสดงจำนวนครั้งที่แต่ละตัวปรากฏ

อินพุต

Arr[] = {1, 4, 4, 5, 5, 5, 5}

เอาต์พุต

1→1, 2→0, 3→0, 4→2, 5→4

คำอธิบาย − สมาชิกสูงสุดคือ 5

วิธีการที่ใช้ในโปรแกรมด้านล่าง

  • โปรแกรมทำงานสำหรับอาเรย์ที่มีตัวเลข 1 ถึง 10
  • ฟังก์ชัน printfrequency(int arr[], int n) พิมพ์ความถี่ 1 ถึง 10
  • ทำ arr[i] = arr[i] - 1 ทำให้ index 0 เก็บความถี่ของ 1, index 1 เก็บ 2, ...
  • ลูป i=0..n-1: arr[arr[i]%10] += 10 (เพิ่ม 10 ทุกครั้งที่เจอตัวเลขนั้น)
  • ลูป i=0..9: พิมพ์ i+1 และ arr[i]/10 (ความถี่)

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

void printfrequency(int arr[], int n) {
    for (int i = 0; i < n; i++)
        arr[i] = arr[i] - 1;
    for (int i = 0; i < n; i++)
        arr[arr[i] % 10] = arr[arr[i] % 10] + 10;
    for (int i = 0; i < 10; i++)
        cout << i + 1 << " -> " << arr[i] / 10 << endl;
}

int main() {
    int arr[] = {2, 3, 3, 2, 5, 6, 7, 7, 7, 8, 8, 9, 9};
    int n = sizeof(arr) / sizeof(arr[0]);
    printfrequency(arr, n);
    return 0;
}

ผลลัพธ์

1 -> 0
2 -> 2
3 -> 2
4 -> 0
5 -> 1
6 -> 1
7 -> 3
8 -> 2
9 -> 5
10 -> 0