[关闭]
@UDvoid 2015-07-28T23:55:54.000000Z 字数 666 阅读 2247

2015-7-28 美团面试 算法题

算法 面试

面试的时候想复杂了。。。
数据范围: 1a1018, 0k100,
对于每一个位的处理,只要找到能在剩余步数中一直交换到当前位且大于当前位数值的最大数,按照题意逐个交换即可,记得把k减去相应的步数;
因为k很小而且a的位数也很小,时间上可以承受;

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int k, len;
  4. char a[20];
  5. void input()
  6. {
  7. int i;
  8. scanf("%s", a);
  9. scanf("%d", &k);
  10. len = strlen(a);
  11. for(i = 0; i < len; i++)
  12. a[i] -= '0';
  13. }
  14. void output()
  15. {
  16. int i;
  17. for(i = 0; i < len; i++){
  18. printf("%d", a[i]);
  19. }
  20. }
  21. void work(int l)
  22. {
  23. int i, j, mx = -1, mxi = 0, tmp;
  24. for(i = l + 1; i < l + k + 1 && i < len; i++){ //贪心找符合条件的最大数
  25. if(a[i] > a[l] && a[i] > mx)
  26. mx =a[i], mxi = i;
  27. }
  28. if(mx != -1){
  29. for(j = mxi; j > l; j--){ //交换相邻的数
  30. tmp = a[j];
  31. a[j] = a[j - 1];
  32. a[j - 1] = tmp;
  33. }
  34. k -= mxi - l; //更新剩余步数
  35. }
  36. return;
  37. }
  38. int main()
  39. {
  40. int l = 0;
  41. input();
  42. while(k && l < len){
  43. work(l++); //还剩步数的情况下处理每一位
  44. }
  45. output();
  46. return 0;
  47. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注