所有整数,它们是整数的子序列(被视为一串数字)

时间:2014-07-01 12:53:42

标签: algorithm

给定整数1 <= n <= 100000。如何有效地获得整数n的子序列的所有整数(将整数n视为数字串)。我想要一个伪代码。

例如。 输入: n=121输出 1,12,11,2,21(输出顺序不重要)

例如。 输入: n=132输出 1,13,12,3,32,2

提前致谢

3 个答案:

答案 0 :(得分:2)

n = 121

长度= 3

生成所有可能的长度为3的二进制数。请参阅二进制数字中的set bits并打印原始数字中的相应数字。

示例1

121   length=3

000  -> 0    (ignore this:no bit set)
001  -> 1    (__1)
010  -> 2    (_2_)
011  -> 21   (_21)
100  -> 1    (repeated: ignore this)
101  -> 11   (1_1)
110  -> 12   (12_)
111  -> 121  (121)

示例2:n = 1234

1234  length=4

0000  -> 0    (ignore this:no bit set)
0001  -> 4    (___4)
0010  -> 3    (__3_)
0011  -> 34   (__34)
0100  -> 2    (_2__)
0101  -> 24   (_2_4)
0110  -> 23   (_23_)
0111  -> 234  (_234)
1000  -> 1    (1___)
1001  -> 14   (1__4)
1010  -> 13   (1_3_)
1011  -> 134  (1_34)
1100  -> 12   (12__)
1101  -> 124  (12_4)
1110  -> 123  (123_)
1111  -> 1234 (1234)

我在C中制作的上述算法的代码粘贴在下面。我没有进行过很多优化,但逻辑是相同的。

很抱歉未经优化的代码。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define SIZE 30
main()
{
    int i,j,end,index,k,swap;
    char str[SIZE],arr[SIZE];
    char buffer[SIZE],dict[SIZE][SIZE]={'\0'};  //dictlength is used to store the 
    int dictlength=0;
    gets(str);
    for(i=1;i<pow(2,strlen(str));i++)
    {
        index=0;
        end=strlen(str);
        itoa(i,arr,2);
        for(j=strlen(arr);j>=0;j--,end--)
        {
            if(arr[j]=='1')
            {
                buffer[index]=str[end];
                index=index+1;
            }
        }
        buffer[index]='\0';
        for(k=0,j=strlen(buffer)-1; k<j ; k++,j--)
        {
            swap=buffer[k];
            buffer[k]=buffer[j];
            buffer[j]=swap;
        }
        strcpy(dict[dictlength],buffer);
        dictlength++;
    }
    for(i=0;i<dictlength;i++)
        puts(dict[i]);
}

答案 1 :(得分:2)

这是另一个使用递归的版本。这个只使用整数除法和模(都在divmod中组合)来得到&#39;子整数&#39;。它在Python中完成,与伪代码一样好......

def subints(n):
    d, r = divmod(n, 10)
    if d > 0:
        for s in subints(d):
            yield 10*s + r
            yield    s
    yield r

示例:(set得到的数字就足够了;使用list来更好地理解)

>>> print list(subints(1234))
[1234, 123, 124, 12, 134, 13, 14, 1, 234, 23, 24, 2, 34, 3, 4]

答案 2 :(得分:1)

这个怎么样:

    static HashSet<string> Subseq(string input, HashSet<string> result = null, int pos = 0, string current = "")
    {
        if (result == null)
        {
            result = new HashSet<string>();
        }

        if (pos == input.Length)
        {
            return result;
        }

        Subseq(input, result, pos + 1, current);

        current += input[pos];
        if (!result.Contains(current))
        {
            result.Add(current);
        }

        Subseq(input, result, pos + 1, current);

        return result;
    }

被称为:

var result = Subseq("18923928");

如果您不将“123”视为“123”的子序列,则只需将条件current != input添加到最后if