給定相同位數為n的兩個整形數a,b,其中b的每位數直接可以調整位置,我們要通過調整b中每位數的位置,找到乙個b',使得b'為大於a的最小組合數。
如果找不到則返回-1,否則返回b'.
例如:輸入:
n=3a=421
b=123
輸出:-1
輸入:n=4
a=1234
b=1232
輸出:1322
思路:首先將輸入的兩個數放入兩個整形陣列,a,b中,對陣列b進行乙個從小到大的排序處理。
1.對a,b陣列進行乙個按位比較,比較a[i],b[i],找到第乙個i,使得a[i]!=b[i]
2.如果b[i]>a[i],可以直接返回b
3.如果a[i]>b[i],在陣列b的[i+1,n-1]中找乙個j,使得b[j]>=a[i],如果找不到,則i回退一步,i-1的位置a[i-1]=b[i-1],往後找第乙個大於a[i-1]的數b[s],然後將b[s]的值置於i-1處,i-1後的數往後移。
4.如果找到b[j]>a[i],將b[j]的值置於i處,i到j處的值往後移。
5.如果找到b[j]=a[i],i++,重複2-4.
#include #include#include
using
namespace
std;
void trans(vector &b, int h, int
s) b[s]=te;
}int solut(const vector &a, vector &b, int
n) cout
if(i >=n)
return -1
;
int j = i + 1
;
while(a[i] >b[i])
else
if(b[j] ==a[i])
}while(j == n)//
找不到乙個比a[i]大的數,回退到i-1
if(j }
sort(b.begin()+i+1, b.end());//
在找到乙個比a[i]大的數後,將b[i+1]-b[n-1]進行乙個從小到大的排序
}
return0;
}int
main()
sort(b.begin(), b.end());
int s =solut(a, b, n);
if(s == -1
) cout
<<-1
)
return0;
}
一道錯過的很基礎的筆試題
目前只記得個大概了 乙個16位的作業系統 unsigned char a 4 3 a 當初自己寫的答案是3,但是真相卻不是這樣?第乙個自己考慮到了隱性強制型別轉換,第二個計算機是通過補碼的形式來表示資料的,不過當時還是算錯了!原碼就是二進位制定點表示法,即最高位為符號位,0 表示正,1 表示負,其餘...
一道筆試題
看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...
一道筆試題
上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...