שאתה מגדיר מערך של ints כזה:
בעצם יש לך תאים באינדקסים מ 0...25
עכשיו היית רוצה לעשות משהו כזה:
array[a]++;
במקום
array[0]++;
ולכן אם תשים לב במפת ה
ascii
אז לתו 'a'
יש ערך 97..לתו
'b'
יש ערך 98..וכו עד התו
'z'
..הם באים אחד אחרי השני..
(אני מתייחס כאן רק ל
LOWER CASE)..
לכן בעצם
array[0] = array['a' - 'a']
array[1] = array['b' - 'a']
....
array[25] = array['z' - 'a']
בקיצור אתה יוצר מערך של Int
בגודל 26 ומאתחל את כל התאים ל 0.
מקבל string
ועובר עליו תו תו.
לכל תו אתה מעביר את התו הזה ל lowercase באמצעות פונקציה פשוטה(אם כל התוים הם lowercase מלכתחילה אז תתעלם..)
ואז אתה פשוט מאוד תקח כל תו כזה שהוא מטיפוס char ותעשה את הדבר הבא: int array[26] = {0} for(int i = 0 ; i < stringLength ; i++) { char c = toLower(string[i]); // convert char to lower case array[c - 'a']++; // do the simple conversion as explained above }
|
מערך הוא כן טיפוס נתונים..
מבחינת יעילות אז אתה רץ פעם אחת על המחרוזת..ועל כל תו עושה פעולה קבועה שלא נחשבת..לאחר מכן מעבר על מערך ה buckets תעלה לך זמן קבוע כי יש כולה 26 אותיות..
בקיצור בסוף אתה עושה משהו כזה:
for(int i = 0 ; i < 26 ; i++)//print numoftimes each letter appeared { if(array[i] > 0) printf("The Letter %c appeared %d times\n",(char)('a' + i) ,array[i]); }
|