123
返回列表 发新帖
楼主: 呵呵小帅哥
收起左侧

[软件] 有没有程序高手。。。求救

[复制链接]
lbj888
发表于 2015-4-5 17:46:43 | 显示全部楼层
thelord 发表于 2015-4-5 16:49
你的方法里只有相邻交换,某些情况下可能不对,比如 2363861
不过确实还有种做法,有点递归的味道
逆向 ...

哦对,没想全,找到关键位置但是换的数不对
jawbin
发表于 2015-4-5 19:41:13 | 显示全部楼层
可以两种方式:

1、编写最简单,最易懂可靠。“暴力穷举”,排序,然后就找到了。

2、最优,最快找到结果。那就要研究算法了。

普通人用第一种,能快捷解决。
thelord
发表于 2015-4-5 20:13:33 | 显示全部楼层
本帖最后由 thelord 于 2015-4-6 10:56 编辑

用 python 实现了下,仅供参考
[mw_shl_code=python,true]def test(num):
        text = str(num)
        rtext = list(text[::-1]) #反转字符串以方便遍历
        for i in xrange(len(rtext)):
                gts = [x for x in rtext[:i] if x > rtext] #找到比自己大的所有数
                if gts:
                        j = rtext.index(min(gts)) #选择其中最小的
                        rtext, rtext[j] = rtext[j], rtext #交换之
                        ret = sorted(rtext[:i], reverse=True) + rtext[i:] #排序
                        return ''.join(ret[::-1])
        return '0'

if __name__ == "__main__":
        num = input("Input a number: ")
        print test(num)[/mw_shl_code]
=========== 最终改进版 =============
[mw_shl_code=python,true]def test(num):
    text = str(num)
    rtext = list(text[::-1]) #反转字符串以方便遍历
    for i in xrange(1, len(rtext)):
        if rtext < rtext[i-1]: #减少无效比较次数
            gts = [x for x in rtext[:i] if x > rtext] #找到比自己大的所有数
            j = rtext.index(min(gts)) #选择其中最小的
            rtext, rtext[j] = rtext[j], rtext #交换之
            return ''.join(rtext[i:][::-1] + rtext[:i])
    return '0'[/mw_shl_code]

评分

参与人数 2人气 +2 收起 理由
peng85344558 + 1 程序很简练
呵呵小帅哥 + 1 感谢解答: )

查看全部评分

jawbin
发表于 2015-4-5 21:12:26 | 显示全部楼层
本帖最后由 jawbin 于 2015-4-5 21:57 编辑

  1. function perm(arr) {
  2.         var result = new Array(arr.length);
  3.         var fac = 1;
  4.         var ret = [];
  5.        
  6.         for (var i = 2; i <= arr.length; i++) {
  7.                 fac *= i;
  8.         }
  9.                  
  10.         for (index = 0; index < fac; index++) {
  11.                 var t = index;
  12.                 for (i = 1; i <= arr.length; i++) {
  13.                         var w = t % i;
  14.                         for (j = i - 1; j > w; j--) {
  15.                                 result[j] = result[j - 1];
  16.                         }
  17.                         result[w] = arr[i - 1];
  18.                         t = Math.floor(t / i);
  19.                 }
  20.                 ret.push(result.join(''));
  21.         }
  22.        
  23.         return ret;
  24. }

  25. function getNextNumber(num){
  26.          var arr = perm((num.toString(10)).split(''));
  27.          var i = 0;
  28.          var j = arr.length;
  29.          var k = 0;

  30.          
  31.          arr.sort();
  32.          
  33.          for(; i<j; i++){
  34.                 if((arr[i] != arr[i+1])&&(parseInt(arr[i]) == num)){
  35.                         k = arr[i+1];
  36.                         if(k == undefined){
  37.                                 k = 0;
  38.                         }
  39.                 }
  40.          }
  41.        
  42.          return k;
  43. }

  44. if(WScript.arguments.length == 1){
  45.         WScript.Echo(getNextNumber(parseInt(WScript.arguments(0))));
  46. }else{
  47.         WScript.Echo(getNextNumber(27711));
  48.         WScript.Echo(getNextNumber(2336574));
  49. }

复制代码


全排列搬用了别人的代码,稍有修改。

Javascript.


缺点:当位数较多时耗用资源很大、运算时间很长。
方鸿渐
发表于 2015-4-5 23:17:02 | 显示全部楼层
我提供一个思路吧,先循环找出每个数字的位置(x)和在升序中的位置(y),然后按y的顺序循环比较,如果y>x,说明另有一个y<x,这两个数互换可以让换后的数大于原数,而y是升序的,所以第一次遇到的是最小的数,直接跟之后最大的数进行互换即可达到效果。有点乱……
邪魔天使改
发表于 2015-4-6 00:48:56 | 显示全部楼层
木有能力。解答不了!
熇煌
头像被屏蔽
发表于 2015-4-6 10:07:04 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
haol
发表于 2015-4-6 11:37:40 | 显示全部楼层
格式不明確?
樓主需要再提供多一些輸入和輸出範例
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-12 23:31 , Processed in 0.095730 second(s), 14 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表