classSolution{public:vector<int>findClosedNumbers(int num){vector<int>n(32,0);int i =31;while(num)//數(shù)字轉(zhuǎn)成二進(jìn)制存在數(shù)組里{n[i--]= num&1;num >>=1;}vector<int>ans(2,-1);next_permutation(n.begin(),n.end());//會(huì)改變?cè)瓟?shù)組long a =calnum(n);if(0< a && a <= INT_MAX)ans[0]= a;prev_permutation(n.begin(), n.end());//上面next了一下,這里往回退2步prev_permutation(n.begin(), n.end());a =calnum(n);if(0< a && a <= INT_MAX)ans[1]= a;return ans;}intcalnum(vector<int>& num){long sum =0;for(int i : num)sum = sum*2+i;return sum;}};
0 ms 6.1 MB
2.2 線性掃描
手寫下一個(gè)排列、前一個(gè)排列
classSolution{public:vector<int>findClosedNumbers(int num){vector<int>n(32,0);int i =31;while(num){n[i--]= num&1;num >>=1;}vector<int>ans(2,-1);next_perm(n);long a =calnum(n);if(0< a && a <= INT_MAX)ans[0]= a;prev_perm(n);prev_perm(n);a =calnum(n);if(0< a && a <= INT_MAX)ans[1]= a;return ans;}voidnext_perm(vector<int>& n){int i = n.size()-2, j;while(i>=0&& n[i]>= n[i+1])i--;//找到下降點(diǎn)if(i>=0){j = i+1;while(j < n.size()&& n[i]< n[j])j++;swap(n[i],n[j-1]);}reverse(n,i+1,n.size()-1);}voidprev_perm(vector<int>& n){int i = n.size()-2, j;while(i>=0&& n[i]<= n[i+1])i--;//找到上升點(diǎn)if(i>=0){j = i+1;while(j < n.size()&& n[i]> n[j])j++;swap(n[i],n[j-1]);}reverse(n,i+1,n.size()-1);}voidreverse(vector<int>& n,int l ,int r){while(l < r)swap(n[l++],n[r--]);}intcalnum(vector<int>& num){//計(jì)算排列后的數(shù)值long sum =0;for(int i : num)sum =(sum<<1)+i;return sum;}};