[問題] 找第一個不重複的位置

看板C_and_CPP (C/C++)作者 (東逼)時間14年前 (2011/12/22 19:15), 編輯推噓5(5027)
留言32則, 8人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) QT C語言 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 無 @@ 問題(Question): 我在練習C語言的時候遇到一個問題是這樣的: 找出陣列中第一次出現重複數值的位置 例如: arr[] = {1,2,3,4,1,5,7}; 則第一次出現重複的值的位置是 4 (arr[4]的值與arr[0]相同) ↑ ↑ 原本打錯了,感謝網友指正@@" 若 arr[] = {1,6,6,7,7,8,9} 則第一次出現重複的值的位置是 2 (arr[2]的值與arr[1]相同) 如果完全沒有重複,那就回傳 -1 現在可以確定的是: 1.陣列大小是固定的 2.陣列內數值皆為int 不確定的是: 1.陣列內數值不一定依大小排列 2.可能會有多組數字重複的情況 以下是我自己寫的,但不是很確定這樣寫法是不是有忽略甚麼 @@ 所以想在這跟大家討論看看 #define TOTAL 7 int repeat_index(void) { int i,j; int arr[TOTAL] = {1,2,3,4,5,1,7}; //測試用 for (i = 0; i < TOTAL; i++) { for (j = 0; j < TOTAL; j++) { if (i == j) continue; if (arr[i] == arr[j]) { return j; } } } return -1; } 我的想法是,依序取出值來跟其餘的值做比較 因為自己跟自己比一定相同,所以當取出值的位置和被比較值的位置相同時就跳過 只要有遇到其他跟自己重複的值就馬上回傳該值的所在位置 若都沒有任何重複的,則回傳-1表示此陣列沒有任何值重複 雖然這樣寫看似是OK的 但我不確定是否有少考慮甚麼 @@ 另外也想請問這個函數有沒有更好的寫法? 像我知道這樣寫如果遇到陣列個數比較多的情況會浪費更多時間 (因為跑兩層迴圈...) 大概就是這樣吧@@ 小弟雖然知道基本C語言的語法 但對於這種最簡潔的寫法還是相當不行 囧 就請大家不吝指教了 @@ 在此也先跟各位謝過了~~~ -- ▍ ▍ ╯╰ ╯╰ ◢◣ ◢◣ 我最愛的 柏柏龍~ 柏柏龍~ ◢██◣ ╮╭ ▎▎╮╭ ▎▎ 柏柏龍~ 柏柏龍~ ⊙ ⊙ ⊙ ⊙ 人人心中都有柏柏龍~ ≡ ▼ ≡ ▲▲ ● ● ≡ ▼ ≡ ■ ■ ■ ■ 憤怒就永遠不會消失~ ⊙⊙ ≡皿 ≡ 炸是最美的擁有~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.179.30

12/22 19:21, , 1F
arr[] = {1,2,3,4,1,5,7}; (arr[3]的值與arr[0]相同)??
12/22 19:21, 1F

12/22 19:22, , 2F
不知道是不是我數錯?
12/22 19:22, 2F

12/22 19:22, , 3F
開另一個陣列p[], p[i]記錄 i 第一次出現的位置
12/22 19:22, 3F

12/22 19:23, , 4F
2層for-loop, j的初始位置應該可以改一下
12/22 19:23, 4F

12/22 19:28, , 5F
啊~~~對不起~~~是我數錯了 囧囧
12/22 19:28, 5F
※ 編輯: donby 來自: 59.120.179.30 (12/22 19:29)

12/22 19:33, , 6F
陣列裡之整數有上、下限嗎?先排序過效率應會較佳。
12/22 19:33, 6F

12/22 19:35, , 7F
請問bi大er大可以再說清楚一點嗎?@@ tr大數值會有上下限
12/22 19:35, 7F

12/22 19:36, , 8F
但能的話希望可以不用直接更改該陣列的值,目的只是找出位置
12/22 19:36, 8F

12/22 19:36, , 9F
若上下限差額可塞到 stack 裡面去就好辦了。
12/22 19:36, 9F

12/22 19:36, , 10F
而已 @@
12/22 19:36, 10F
※ 編輯: donby 來自: 59.120.179.30 (12/22 19:37)

12/22 19:43, , 11F
12/22 19:43, 11F

12/22 19:45, , 12F
有個地方寫錯 http://ideone.com/k0bq6
12/22 19:45, 12F

12/22 22:06, , 13F
如果是我...我會用兩個for去找.但是其實可以排序在找的
12/22 22:06, 13F

12/22 22:07, , 14F
話.可以參考名題精選那本書,他是用一個for去跑
12/22 22:07, 14F

12/22 22:16, , 15F
我想請問tropical72一下,arr[i]+LOW值為負時,index的值
12/22 22:16, 15F

12/22 22:17, , 16F
是? 這部份的觀念不太懂.
12/22 22:17, 16F

12/22 22:21, , 17F
雖然看了#1DOWT2Sd這篇,但是cooper6334的意思有點不懂
12/22 22:21, 17F

12/22 22:51, , 18F
由於原po已知上、下限,故我假設下限是 LOW,上限是UP
12/22 22:51, 18F

12/22 22:51, , 19F
Count[UP-LOW+1]是在做每個數字的計數,但必須做個偏移
12/22 22:51, 19F

12/22 22:52, , 20F
才可放入array,偏移即為 arr[i]+LOW .
12/22 22:52, 20F

12/22 22:53, , 21F
我知道你的演算法意思,但是我的意思是LOW是-100,
12/22 22:53, 21F

12/22 22:54, , 22F
arr[i]+LOW理應是負值,但是我想index應該會有一種轉換
12/22 22:54, 22F

12/22 22:55, , 23F
機制讓他是正值.我好奇是這塊.但是#1DOWT2Sd讓我有點不
12/22 22:55, 23F

12/22 22:55, , 24F
不懂
12/22 22:55, 24F

12/22 22:58, , 25F
Orz.. 不好意思,所有 +LOW 應改成 -LOW 才對
12/22 22:58, 25F

12/22 23:04, , 26F
原來如此
12/22 23:04, 26F

12/23 01:07, , 27F
我怎覺得這想法有問題{1,3,3,1} 本程式回傳3 跟需求不同吧?
12/23 01:07, 27F

12/23 01:09, , 28F
感覺跟前面提到的排序問題類似 有domain好就用counting最好
12/23 01:09, 28F

12/23 16:20, , 29F
用搜尋樹去做可以節省時間...
12/23 16:20, 29F

12/23 17:55, , 30F
firejox超強
12/23 17:55, 30F

12/23 22:11, , 31F
完了,我怎麼一直想到要用 suffix array :(
12/23 22:11, 31F

12/28 00:52, , 32F
感謝以上大大回應@@ tro大的解法讓我有些概念了 受教了~
12/28 00:52, 32F
文章代碼(AID): #1Eyn4txJ (C_and_CPP)
文章代碼(AID): #1Eyn4txJ (C_and_CPP)