一道筆試題,做的很垃圾

2022-08-11 22:39:24 字數 1313 閱讀 4427

給定相同位數為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 ...