Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 返回NSArray中仅出现一次的第一个数字_Ios_Objective C_Algorithm_Nsarray - Fatal编程技术网

Ios 返回NSArray中仅出现一次的第一个数字

Ios 返回NSArray中仅出现一次的第一个数字,ios,objective-c,algorithm,nsarray,Ios,Objective C,Algorithm,Nsarray,我想知道解决这个问题的最佳或最合适的方法是什么:给定一个数字列表示例[2,3,4,2,3],返回列表中只出现一次的第一个数字 我遵循了一些算法方法,并提出了这一点,但不确定Objective-C中是否有任何内置的帮助函数可以让我以更好的性能完成这一任务 如果没有内置解决方案,是否可以对我的方法或任何其他解决方案进行任何改进,以提高性能 这是我为此更新的解决方案: 用于测试: #import "NSArray+Addons.h" @implementation ViewController -

我想知道解决这个问题的最佳或最合适的方法是什么:给定一个数字列表示例[2,3,4,2,3],返回列表中只出现一次的第一个数字

我遵循了一些算法方法,并提出了这一点,但不确定Objective-C中是否有任何内置的帮助函数可以让我以更好的性能完成这一任务

如果没有内置解决方案,是否可以对我的方法或任何其他解决方案进行任何改进,以提高性能

这是我为此更新的解决方案:
用于测试:

#import "NSArray+Addons.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray<NSNumber *> *array = @[@(2), @(7), @(3), @(2), @(3), @(2), @(7), @(3), @(2), @(3), @(4), @(7), @(5), @(5), @(9)];
    NSLog(@"Unique number: %@", [array firstUniqueNumber]);
}

@end
#导入“NSArray+Addons.h”
@实现视图控制器
-(无效)viewDidLoad
{
[超级视图下载];
NSArray*数组=@[@(2),@(7),@(3),@(2),@(2),@(7),@(3),@(2),@(3),@(4),@(7),@(5),@(5),@(9)];
NSLog(@“唯一编号:%@,[array firstUniqueNumber]);
}
@结束
n阵列类别:

#import "NSArray+Addons.h"
#import "NSMutableDictionary+Addons.h"

@implementation NSArray (Addons)

- (NSNumber *)firstUniqueNumber
{
    if (!self.count)
    {
        return nil;
    }

    NSMutableDictionary<NSNumber *, NSNumber *> *myUniqueNumbers = [[NSMutableDictionary alloc] init];

    return [myUniqueNumbers uniqueValueFromArray:self];
}

@end
#import "NSMutableDictionary+Addons.h"

@implementation NSMutableDictionary (Addons)

- (NSNumber *)uniqueValueFromArray:(NSArray<NSNumber *> *)array
{
    if (!array.count)
    {
        return nil;
    }

    for (NSNumber *number in array)
    {
        if (!self[number])
        {
            self[number] = [NSNumber numberWithInteger:1];
        }
        else
        {
            NSInteger count = [self[number] integerValue];
            count++;
            self[number] = [NSNumber numberWithInteger:count];
        }
    }

    return [self uniqueNumberWithArray:array];
}


- (NSNumber *)uniqueNumberWithArray:(NSArray<NSNumber *> *)array
{
    if (!array.count)
    {
        return nil;
    }

    NSNumber *uniqueNumber = nil;

    for (NSInteger index = array.count - 1; index > 0; index--)
    {
        NSNumber *key = array[index];

        if (self[key] && [self[key] integerValue] == 1)
        {
            uniqueNumber = key;
        }
    }

    return uniqueNumber;
}

@end
array = [2, 3, 4, 2, 3]
create histogram: {[2=2] [3=2], [4=1]}
iterate the array:
   check 2, it has value of 2 in histogram. continue
   check 3, it has value of 2 in histogram. continue
   check 4, it has value of 1 in histogram. Return it and finish.
#导入“NSArray+Addons.h”
#导入“NSMutableDictionary+Addons.h”
@实现NSArray(插件)
-(NSNumber*)第一个唯一编号
{
如果(!self.count)
{
返回零;
}
NSMutableDictionary*myUniqueNumbers=[[NSMutableDictionary alloc]init];
返回[MyUniqueNumber uniqueValueFromArray:self];
}
@结束
NSMutableDictionary类别:

#import "NSArray+Addons.h"
#import "NSMutableDictionary+Addons.h"

@implementation NSArray (Addons)

- (NSNumber *)firstUniqueNumber
{
    if (!self.count)
    {
        return nil;
    }

    NSMutableDictionary<NSNumber *, NSNumber *> *myUniqueNumbers = [[NSMutableDictionary alloc] init];

    return [myUniqueNumbers uniqueValueFromArray:self];
}

@end
#import "NSMutableDictionary+Addons.h"

@implementation NSMutableDictionary (Addons)

- (NSNumber *)uniqueValueFromArray:(NSArray<NSNumber *> *)array
{
    if (!array.count)
    {
        return nil;
    }

    for (NSNumber *number in array)
    {
        if (!self[number])
        {
            self[number] = [NSNumber numberWithInteger:1];
        }
        else
        {
            NSInteger count = [self[number] integerValue];
            count++;
            self[number] = [NSNumber numberWithInteger:count];
        }
    }

    return [self uniqueNumberWithArray:array];
}


- (NSNumber *)uniqueNumberWithArray:(NSArray<NSNumber *> *)array
{
    if (!array.count)
    {
        return nil;
    }

    NSNumber *uniqueNumber = nil;

    for (NSInteger index = array.count - 1; index > 0; index--)
    {
        NSNumber *key = array[index];

        if (self[key] && [self[key] integerValue] == 1)
        {
            uniqueNumber = key;
        }
    }

    return uniqueNumber;
}

@end
array = [2, 3, 4, 2, 3]
create histogram: {[2=2] [3=2], [4=1]}
iterate the array:
   check 2, it has value of 2 in histogram. continue
   check 3, it has value of 2 in histogram. continue
   check 4, it has value of 1 in histogram. Return it and finish.
#导入“NSMutableDictionary+Addons.h”
@NSMutableDictionary(插件)的实现
-(NSNumber*)uniqueValueFromArray:(NSArray*)数组
{
如果(!array.count)
{
返回零;
}
for(NSNumber*数组中的编号)
{
如果(!self[number])
{
self[number]=[NSNumber numberWithInteger:1];
}
其他的
{
NSInteger count=[self[number]integerValue];
计数++;
self[number]=[NSNumber numberWithInteger:count];
}
}
返回[self-uniqueNumberWithArray:array];
}
-(NSNumber*)uniqueNumberWithArray:(NSArray*)数组
{
如果(!array.count)
{
返回零;
}
NSNumber*唯一编号=零;
对于(NSInteger index=array.count-1;索引>0;索引--)
{
NSNumber*键=数组[索引];
if(self[key]&&[self[key]integerValue]==1)
{
uniqueNumber=键;
}
}
返回唯一编号;
}
@结束

如果不使用哈希和额外空间,这个问题可以简化为,因此没有线性时间解决方案

O(n)时间平均+空间中的一个简单解决方案是:

  • 构建一个基于散列的数据直方图,将每个值映射到其发生次数
  • 找到数组中第一个直方图值为1的数字
  • 伪代码:

    map = new hashmap
    for each element x:
       if map contains x is a key:
           map.put(x,map.get(x)+1)
       else:
           map.put(x,1)
    for each element x in array:
       if map.get(x) == 1:
           return x
    //if reached here - no distinct element
    
    示例:

    #import "NSArray+Addons.h"
    #import "NSMutableDictionary+Addons.h"
    
    @implementation NSArray (Addons)
    
    - (NSNumber *)firstUniqueNumber
    {
        if (!self.count)
        {
            return nil;
        }
    
        NSMutableDictionary<NSNumber *, NSNumber *> *myUniqueNumbers = [[NSMutableDictionary alloc] init];
    
        return [myUniqueNumbers uniqueValueFromArray:self];
    }
    
    @end
    
    #import "NSMutableDictionary+Addons.h"
    
    @implementation NSMutableDictionary (Addons)
    
    - (NSNumber *)uniqueValueFromArray:(NSArray<NSNumber *> *)array
    {
        if (!array.count)
        {
            return nil;
        }
    
        for (NSNumber *number in array)
        {
            if (!self[number])
            {
                self[number] = [NSNumber numberWithInteger:1];
            }
            else
            {
                NSInteger count = [self[number] integerValue];
                count++;
                self[number] = [NSNumber numberWithInteger:count];
            }
        }
    
        return [self uniqueNumberWithArray:array];
    }
    
    
    - (NSNumber *)uniqueNumberWithArray:(NSArray<NSNumber *> *)array
    {
        if (!array.count)
        {
            return nil;
        }
    
        NSNumber *uniqueNumber = nil;
    
        for (NSInteger index = array.count - 1; index > 0; index--)
        {
            NSNumber *key = array[index];
    
            if (self[key] && [self[key] integerValue] == 1)
            {
                uniqueNumber = key;
            }
        }
    
        return uniqueNumber;
    }
    
    @end
    
    array = [2, 3, 4, 2, 3]
    create histogram: {[2=2] [3=2], [4=1]}
    iterate the array:
       check 2, it has value of 2 in histogram. continue
       check 3, it has value of 2 in histogram. continue
       check 4, it has value of 1 in histogram. Return it and finish.
    

    如果不使用散列和额外的空间,这个问题可以简化为,因此没有线性时间解决方案

    O(n)时间平均+空间中的一个简单解决方案是:

  • 构建一个基于散列的数据直方图,将每个值映射到其发生次数
  • 找到数组中第一个直方图值为1的数字
  • 伪代码:

    map = new hashmap
    for each element x:
       if map contains x is a key:
           map.put(x,map.get(x)+1)
       else:
           map.put(x,1)
    for each element x in array:
       if map.get(x) == 1:
           return x
    //if reached here - no distinct element
    
    示例:

    #import "NSArray+Addons.h"
    #import "NSMutableDictionary+Addons.h"
    
    @implementation NSArray (Addons)
    
    - (NSNumber *)firstUniqueNumber
    {
        if (!self.count)
        {
            return nil;
        }
    
        NSMutableDictionary<NSNumber *, NSNumber *> *myUniqueNumbers = [[NSMutableDictionary alloc] init];
    
        return [myUniqueNumbers uniqueValueFromArray:self];
    }
    
    @end
    
    #import "NSMutableDictionary+Addons.h"
    
    @implementation NSMutableDictionary (Addons)
    
    - (NSNumber *)uniqueValueFromArray:(NSArray<NSNumber *> *)array
    {
        if (!array.count)
        {
            return nil;
        }
    
        for (NSNumber *number in array)
        {
            if (!self[number])
            {
                self[number] = [NSNumber numberWithInteger:1];
            }
            else
            {
                NSInteger count = [self[number] integerValue];
                count++;
                self[number] = [NSNumber numberWithInteger:count];
            }
        }
    
        return [self uniqueNumberWithArray:array];
    }
    
    
    - (NSNumber *)uniqueNumberWithArray:(NSArray<NSNumber *> *)array
    {
        if (!array.count)
        {
            return nil;
        }
    
        NSNumber *uniqueNumber = nil;
    
        for (NSInteger index = array.count - 1; index > 0; index--)
        {
            NSNumber *key = array[index];
    
            if (self[key] && [self[key] integerValue] == 1)
            {
                uniqueNumber = key;
            }
        }
    
        return uniqueNumber;
    }
    
    @end
    
    array = [2, 3, 4, 2, 3]
    create histogram: {[2=2] [3=2], [4=1]}
    iterate the array:
       check 2, it has value of 2 in histogram. continue
       check 3, it has value of 2 in histogram. continue
       check 4, it has value of 1 in histogram. Return it and finish.
    
    在这里,你需要一个很好的方法来记录某件事情发生的次数,所以利用NSCountedSet的“计数”方法。将告诉您对象出现的次数



    在这里,你需要一个很好的方法来记录某件事情发生的次数,所以利用NSCountedSet的“计数”方法。将告诉您一个对象发生了多少次。

    没有内置的解决方案,因为这不是一个常见的要求,所以定制解决方案是唯一的方法。@trojanfoe哦,真的吗?你能对我的方法提出改进意见吗?是否有任何情况下我的方法会崩溃?或者无法返回数字?如果有两个不重复的数字,我认为你的方案行不通。如果一个数字重复3次,我不能说我完全清楚你的方法是如何工作的。你测试过了吗?它适用于
    0
    ?@JoJo:它不适用。但是如果你假设数组包含两个数字,一个数字只包含一次,而其他什么都不包含,那么它就工作了。。。因此,它适用于例如(3,3,1,5,5),因为3^3^1^5^5=(3^3)^1^(5^5)=0^1^0=1没有内置的解决方案,因为这不是一个常见的要求,所以定制解决方案是唯一的方法。@trojanfoe哦,真的吗?你能对我的方法提出改进意见吗?是否有任何情况下我的方法会崩溃?或者无法返回数字?如果有两个不重复的数字,我认为你的方案行不通。如果一个数字重复3次,我不能说我完全清楚你的方法是如何工作的。你测试过了吗?它适用于
    0
    ?@JoJo:它不适用。但是如果你假设数组包含两个数字,一个数字只包含一次,而其他什么都不包含,那么它就工作了。。。因此,它适用于例如(3,3,1,5,5),因为3^3^1^5^5=(3^3)^1^(5^5)=0^1^0=1您的解决方案不提供第一个唯一的数字。@特洛伊木马是的,它提供了。你为什么说它没有?是的,我知道它有。抱歉。但是,您的解决方案没有提供第一个唯一的号码。@trojanfoe是的,它提供了。你为什么说它没有?是的,我知道它有。抱歉,是的
    -indexOfObjectPassingTest:
    按顺序枚举数组,并在通过测试的第一个数组处停止。这是一个很好的解决方案。我写了一个做同样事情的函数,结果证明
    NSCountedSet
    解决方案比手写解决方案快20%左右。这很好,我测试了我能想到的大多数情况,效果很好。是的
    -indexOfObjectPassingTest:
    按顺序枚举数组,并在通过测试的第一个数组处停止。这是一个很好的解决方案。我写了一个函数做同样的事情,结果证明