剛剛拿到題目的時候,我覺得這道題目還是蠻簡單的,想到的第乙個辦法就是插空。
簡單來說就是:
統計字母出現的次數
判斷是否可以做到把字母隔開,也就是 乙個字母出現的次數要小於(n+1) / 2
然後將字母按順序插空——每隔乙個空插入,如果該空有字母存在則在下乙個空格插入。
說幹就幹,一頓洋洋灑灑的操作後,**如下:
class solution
//判斷是否有超過一半的字母是相同的。
int count = 0;
for(int i = 0; i < alphabets.length; i++)else if(alphabets[i] > 0)
while(newstring[count] != 0)
newstring[count] = (char)(i+97);
count += 2;}}
}return string.valueof(newstring);
}
}
結果如下:
很是悲壯。
痛定思痛——————!~!————————————
看到例子錯誤的原因主要是:出現較多的次數的字母在後面,前面的位置都被出現次數較少的字母給佔了。
原來我還差乙個排序,嘿嘿
這次調整思路:
統計字母出現的次數
判斷是否可以做到把字母隔開,也就是 乙個字母出現的次數要小於(n+1) / 2
然後將字母按出現次數大小順序插空——每隔乙個空插入,如果該空有字母存在則在下乙個空格插入。
這裡出現了乙個很糾結的點:我應該要怎麼排序?
這裡的排序要求是出現的次數大小排序,並且將出現次數的字母給帶出來。沒有想到什麼好的方法,
兩個元素一起的我就想到了map,在想key存字母,value存出現的次數。完美!
結果想到map是不能排序的,因為hashmap是根據key的hash值來儲存的。
那麼只好折中了,把value的值拿出來,排序。然後遍歷map找到最大的value,將value個key插入到陣列中。
結果又出現乙個問題:如果又兩個相同的value,那麼就會出現陣列越界的情況。
針對這乙個問題,我的解決辦法是每次插入完乙個key後,將改key從map中移除。這樣就避免了問題。
通過**如下:
class solution else
}
int counts = new int[alphabet.size()];
int count = 0;
for(character c : alphabet.keyset())
arrays.sort(counts);
int location = 0;
for(int i = counts.length-1; i >= 0; i--)
break;}}
alphabet.remove(c1);
}return string.valueof(newstring);
}
敲完**發現用了四次迴圈:先迴圈一層排序好的value
在迴圈map找相應的key
再迴圈value將key插入陣列中
外加乙個對陣列有值的情況,有乙個while使得插入陣列的指標偏移的操作
寫完戰戰兢兢的提交了**,結果發現通過了。並且拿到了11月的每日打卡的勳章。有點小感動。
總結一下:
一開始的思路是沒有錯的,但是沒有考慮全。沒有考慮到出現次數較多的的排在後面的情況
後面看到錯誤的案例後,及時調整。在寫**的時候,針對同乙個value可能會造成陣列溢位的情況沒有考慮到
總的來說就是沒有考慮清楚邊界的問題。
Leetcode 767 重構字串
給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 1 輸入 s aab 輸出 aba 示例 2 輸入 s aaab 輸出 注意 解題思路 任務排程問題,排序。本題有點像之前的乙個任務排程問題,由於題量太大,忘了哪乙個。統計當前...
leetcode 767 重構字串
描述 給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 1 輸入 s aab 輸出 aba 示例 2 輸入 s aaab 輸出 注意 s 只包含小寫字母並且長度在 1,500 區間內。思路從小到大,交叉著插入 bool cmp...
LeetCode 767 重構字串
給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 1 輸入 s aab 輸出 aba 示例 2 輸入 s aaab 輸出 注意 s 只包含小寫字母並且長度在 1,500 區間內。通過次數13,259 提交次數30,089思路 ...