给定整数1 <= n <= 100000。如何有效地获得整数n的子序列的所有整数(将整数n视为数字串)。我想要一个伪代码。
例如。 输入: n=121
,输出 1,12,11,2,21
(输出顺序不重要)
例如。 输入: n=132
,输出 1,13,12,3,32,2
提前致谢
答案 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
。