[分享][請益] 廻文數/remove_dump_memory / MaxLevel

看板Prob_Solve (計算數學 Problem Solving)作者 (藍影)時間12年前 (2012/02/04 17:45), 編輯推噓4(4018)
留言22則, 5人參與, 最新討論串1/1
最近拿到 C/C++ 面試卷,比較有印象的是其中三題, 由於時間有限,沒能把所有題目記下來,且為原文 (所以我的敘述可能有點差異), 也僅憑印象一起來探討。 1. 迴文數 迴文數的定義版上很多人都知道了 < ACM 基礎題 >, 但這題隱喻中加了幾個限制: a. effect b. unsigned IsPalindrome(unsigned num); c. 不可調用任何 C/C++ 函式庫完成 所以和 ACM 不同的是不可以用 char* 來存。 當下我想到的作法是二種,一種是用 while(num) {num/=10;} 技巧,每個位數塞到 const int MAX=20; int dig[MAX]; 裡面去,同時紀錄使用了 used_dig 位數, 問題便轉成了對一 array/string 判斷回文數 <最後是用這解法>。 另一想法是直接找 min pwr, st pwr>=num, 之後再做一個 rst 為 num 的 inverse, 最後再 return rst==num <直覺較麻煩,所以沒用這個>, 請教各版友針對此三限制之 Palindrome number 有何想法? 2. 移除陣列裡重覆之元素 unsigned remove_dumped_memory(unsigned *array, unsigned nItem); 假設一 array 已經過遞增排序, int array[] = {1,1,2,2,2,3,5,8,8,9}, 由於元素有 10 個,所以在傳入 nItem 的時候會先確定是 10 << 也就是元素個數 >>。 但題意是,經過 remove_dumped_memory 後,能把 array 重覆的拿掉, 然後傳回不重覆的元素個數,以上述為例,最後 array[] = {1,2,3,5,8,9}; 傳回6 (如果問我 array[6]~array[9] 哪去了?我只能說從題意看不出來)。 同樣的題目裡有個 keyword : effective 直覺掃一遍即可,當時粗寫大概是 unsigned remove_dumped_memory(unsigned *array, unsigned nItem) { int cnt=0, last_position=0; for(i=0; i<nItem-1; ++i){ if(array[i]!=array[i+1]) { array[last_position++]=array[i]; ++cnt; } } return cnt; } 但還有另一份試題沒寫,沒再花時間磨這個。 3. MaxLevel 這個資料結構的東西我很亂,要求要 C 寫。題意是要求 binary tree deep level ( 如果我沒意會錯的話 ... ) typedef struct node{ int value; struct node* left; struct node* right; }mynode; int MaxLevel(struct node* p); 因為不熟,時間也來不急,就亂寫了。大概是寫得像 int max(int a, int b) { return (a>b)? a : b; } int MaxLevel(struct node* p) { if(p==NULL) return 0; else return 1+max(MaxLevel(p->left), MaxLevel(p->right)); } 最後這題反而被抓出來電 Orz -- 世界上有種, 將 不可能 轉換為 無限可能 的強大力量, 我稱它為 - 信念 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.165.40 tropical72:轉錄至看板 C_and_CPP 02/04 17:47 ※ 編輯: tropical72 來自: 123.195.165.40 (02/04 17:51)

02/04 18:11, , 1F
回文數就邊除編建inverse number就好了呀~
02/04 18:11, 1F

02/04 18:37, , 2F
第三題這樣寫有啥問題? 不過 function name 叫 depth 就夠了
02/04 18:37, 2F

02/04 19:13, , 3F
第二題a[6]...a[9]還在但是不重要不用管他
02/04 19:13, 3F

02/04 19:17, , 4F
我其實想知道是怎麼死的,最後只有提 "你這題好像沒解
02/04 19:17, 4F

02/04 19:17, , 5F
出來",所以想說是不是我解錯了 Orz
02/04 19:17, 5F

02/04 19:18, , 6F
前兩句是針對第三題。
02/04 19:18, 6F

02/04 19:19, , 7F
<<在想是不是我額外寫了一份 int max(int,int); 關係>>
02/04 19:19, 7F

02/04 20:58, , 8F
1其實不用開陣列 原數不斷 %10 /10 另一數不斷 +餘數 *10
02/04 20:58, 8F

02/04 20:59, , 9F
最後比較兩數是不是完全相等就可以了
02/04 20:59, 9F

02/04 21:00, , 10F
(順序寫反了) *10 +餘數
02/04 21:00, 10F

02/04 21:01, , 11F
2就由小到大掃過陣列 遇到不一樣的數字就存起來
02/04 21:01, 11F

02/04 21:01, , 12F
一樣也不需要開新的陣列
02/04 21:01, 12F

02/04 21:02, , 13F
3的話,沒有額外資訊就只能DFS/BFS了
02/04 21:02, 13F

02/04 21:03, , 14F
或者寫成遞迴的模樣 答案 = max(左子樹高度,右子樹高度) + 1
02/04 21:03, 14F

02/04 21:14, , 15F
另外2有一個issue: 如果不開新陣列,就會浪費a[6]~a[9]記憶體
02/04 21:14, 15F

02/04 21:34, , 16F
to二樓: 也許原po的第三題寫得最好 面試官想要深入討論 XD
02/04 21:34, 16F

02/04 21:35, , 17F
謝謝各位意見,大概知道哪些地方沒做很好.感謝.
02/04 21:35, 17F

02/04 21:36, , 18F
oh,面試官是直接跟我說,"這題好像沒解出來",所以我想是
02/04 21:36, 18F

02/04 21:36, , 19F
不是我解得有問題 <如果誤會題意的話就另當別論便是>
02/04 21:36, 19F

02/04 21:42, , 20F
我在想是不是因為沒有呼叫 function 把 tree root 當作參數?
02/04 21:42, 20F

02/04 21:43, , 21F
使用者肯定不知道tree root在哪 所以要幫使用者處理到好
02/04 21:43, 21F

02/04 21:44, , 22F
可能要整個包成一個函數 裡面要呼叫你寫的maxheight(root)
02/04 21:44, 22F
文章代碼(AID): #1FBFuaqO (Prob_Solve)
文章代碼(AID): #1FBFuaqO (Prob_Solve)