gpt4 book ai didi

objective-c - 生成 NSArray 元素的排列

转载 作者:太空狗 更新时间:2023-10-30 03:30:40 25 4
gpt4 key购买 nike

假设我有一个像这样的 NSNumbers 的 NSArray:1、2、3

那么所有可能排列的集合看起来像这样:

1, 2, 3

1, 3, 2

2, 1, 3

2, 3, 1

3, 1, 2

3, 2, 1

在 objective-c 中执行此操作的好方法是什么?

最佳答案

我已经使用了上面 Wevah 的回答中的代码并发现了它的一些问题所以我在这里进行更改以使其正常工作:

NSArray+Permutation.h

@interface NSArray(Permutation)

- (NSArray *)allPermutations;

@end

NSArray+Permutation.m

#import "NSArray+Permutation.h"

#define MAX_PERMUTATION_COUNT 20000

NSInteger *pc_next_permutation(NSInteger *perm, const NSInteger size);
NSInteger *pc_next_permutation(NSInteger *perm, const NSInteger size)
{
// slide down the array looking for where we're smaller than the next guy
NSInteger pos1;
for (pos1 = size - 1; perm[pos1] >= perm[pos1 + 1] && pos1 > -1; --pos1);

// if this doesn't occur, we've finished our permutations
// the array is reversed: (1, 2, 3, 4) => (4, 3, 2, 1)
if (pos1 == -1)
return NULL;

assert(pos1 >= 0 && pos1 <= size);

NSInteger pos2;
// slide down the array looking for a bigger number than what we found before
for (pos2 = size; perm[pos2] <= perm[pos1] && pos2 > 0; --pos2);

assert(pos2 >= 0 && pos2 <= size);

// swap them
NSInteger tmp = perm[pos1]; perm[pos1] = perm[pos2]; perm[pos2] = tmp;

// now reverse the elements in between by swapping the ends
for (++pos1, pos2 = size; pos1 < pos2; ++pos1, --pos2) {
assert(pos1 >= 0 && pos1 <= size);
assert(pos2 >= 0 && pos2 <= size);

tmp = perm[pos1]; perm[pos1] = perm[pos2]; perm[pos2] = tmp;
}

return perm;
}

@implementation NSArray(Permutation)

- (NSArray *)allPermutations
{
NSInteger size = [self count];
NSInteger *perm = malloc(size * sizeof(NSInteger));

for (NSInteger idx = 0; idx < size; ++idx)
perm[idx] = idx;

NSInteger permutationCount = 0;

--size;

NSMutableArray *perms = [NSMutableArray array];

do {
NSMutableArray *newPerm = [NSMutableArray array];

for (NSInteger i = 0; i <= size; ++i)
[newPerm addObject:[self objectAtIndex:perm[i]]];

[perms addObject:newPerm];
} while ((perm = pc_next_permutation(perm, size)) && ++permutationCount < MAX_PERMUTATION_COUNT);
free(perm);

return perms;
}

@end

关于objective-c - 生成 NSArray 元素的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3791265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com