题解 | #反转字符串#
丑数
http://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b
丑数
思路
1、使用一个数组保存之前的丑数
2、更新下一个丑数的时候只需要比较三个值即可
3、所以,程序的核心就是维护好三个值(对应的下标)
代码
class Solution { public: bool isUgly(int x ){ while(x%2==0){ x = x/2; } while(x%3==0){ x=x/3; } while(x%5==0){ x=x/5; } return 1==x; } /* int GetUglyNumber_Solution(int index) { if(index==1){ return 1; } // 最笨的方法 int count=1; int i = 2; while(1){ if(isUgly(i)){ count++; } if(count==index){ return i; } i++; } return 0; } */ int GetUglyNumber_Solution(int index){ // 初始化 if(index < 5){ vector<int> ugly_arr ={ 1, 2, 3, 4, 5}; return ugly_arr[index-1]; } vector<int> ugly_arr(index, 0); ugly_arr[0] = 1; ugly_arr[1] = 2; ugly_arr[2] = 3; ugly_arr[3] = 4; ugly_arr[4] = 5; // 初始化要维护的三个index int t2_index = 2; int t3_index = 1; int t5_index = 1; int cur_lne = 5; while(cur_lne < index){ // 获取三个候选值 int M2 = ugly_arr[t2_index]*2; int M3 = ugly_arr[t3_index]*3; int M5 = ugly_arr[t5_index]*5; // 取三个候选值的最小值作为下一个丑数 vector<int> tmp = {M2, M3, M5}; auto min_ugly = *(min_element(tmp.begin(), tmp.end())); ugly_arr[cur_lne] = min_ugly; cur_lne++; // 维护更新三个下标 if(M2 == min_ugly){ t2_index++; } if(M3 == min_ugly){ t3_index++; } if(M5 == min_ugly){ t5_index++; } } return ugly_arr[--index]; } };