跳转至

哈希集合

去除重复字符

例如:fabccdeeffacb打印fabcde 每个字符打印一次

#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;

//接收一个字符串作为输入,并返回去除重复字符后的结果字符串。
string removeDuplicates(string str) {
    string result;                      //存储最终结果
    unordered_set<char> seen;  // 用于存储已经出现过的字符

  //遍历字符串中的每个字符,如果当前字符不在seen集合中,则将其添加到result字符串和seen集合中。
    for (char ch : str) {
        if (seen.find(ch) == seen.end()) {
            // 如果当前字符未出现过,则添加到结果字符串和哈希集合中
            result += ch;
            seen.insert(ch);
        }
    }

    return result;//返回去除重复字符后的结果
}

int main() {
    string str = "fabccdeeffacb";
    string result = removeDuplicates(str);
    cout << "Result: " << result << endl;//Result: fabcde
    return 0;
}

从数组中找出重复的元素

例如:[1, 2, 1, 7, 4, 5, 2, 6, 5] 打印结果1, 2, 5

从给定的数组中找出重复的元素,并将它们打印出来,可以使用哈希集合(unordered_set)来跟踪已经出现过的元素。

#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;

void printDuplicates(const vector<int>& nums) {
    unordered_set<int> seen;  // 用于存储已经出现过的元素
    unordered_set<int> duplicates;  // 用于存储重复的元素

    for (int num : nums) {
        if (seen.find(num) != seen.end()) {
            // 如果当前元素已经出现过,则添加到重复元素集合中
            duplicates.insert(num);
        }
        seen.insert(num);
    }

    cout << "Duplicate elements: ";
    for (int num : duplicates) {
        cout << num << " ";
    }
    cout << endl;
}

int main() {
    vector<int> nums = {1, 2, 1, 7, 4, 5, 2, 6, 5};
    printDuplicates(nums);//Duplicate elements: 1 2 5
    return 0;
}

数组随机10条数据

- (NSArray *)randomArray:(NSArray *)array {
    //小于等于10条的直接返回原数组
    if (array.count <11) {
        return array;
    }
    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:array];
    NSMutableSet *randomSet = [[NSMutableSet alloc] init];
    while ([randomSet count] < 10) {
        int r = arc4random() % [tempArray count];
        [randomSet addObject:[tempArray objectAtIndex:r]];
        //从选择源中删除已经选中的 已经选中的不必再次选中
        [tempArray removeObjectAtIndex:r];
    }
    return [randomSet allObjects];
}

数组合并

合并两个数组,相同的元素不重复添加。

Objective-C语言 两个数组: 数组1:@[ @{@"aaa":@"dss"} @{@"bbb":@"fsaf"} @{@"ccc":@"fdgh"} @{@"ddd":@"gfg"} @{@"eee":@"gfdsg"} @{@"fff":@"ewq"} @{@"ggg":@"gerr"}]

数组2:@[ @{@"aaa":@"fdsf"} @{@"hhh":@"retr"} @{@"jjj":@"fdgrterh"} @{@"ddd":@"cxvz"}]

将上面两个数组合并为一个数组 要求如果数组2中元素字典的key在数组1中已经存在,则不添加。只添加不一样的。

方法:

为了合并两个数组并满足上面的要求,可以遍历数组2,并检查其元素(字典)的key是否已经在数组1中存在。如果不存在,我们将其添加到数组1中。这里是Objective-C代码的一个示例:

NSArray *array1 = @[
    @{@"aaa": @"dss"},
    @{@"bbb": @"fsaf"},
    @{@"ccc": @"fdgh"},
    @{@"ddd": @"gfg"},
    @{@"eee": @"gfdsg"},
    @{@"fff": @"ewq"},
    @{@"ggg": @"gerr"}
];

NSArray *array2 = @[
    @{@"aaa": @"fdsf"},
    @{@"hhh": @"retr"},
    @{@"jjj": @"fdgrterh"},
    @{@"ddd": @"cxvz"}
];

NSMutableArray *mergedArray = [NSMutableArray arrayWithArray:array1];
NSMutableSet *existingKeys = [NSMutableSet set];

// 首先将所有array1中的key加入到existingKeys集合中
for (NSDictionary *dict in array1) {
    [existingKeys addObjectsFromArray:[dict allKeys]];
}

// 遍历array2,检查key是否在existingKeys集合中
for (NSDictionary *dict in array2) {
    NSString *keyInDict2 = [[dict allKeys] firstObject];
    if (![existingKeys containsObject:keyInDict2]) {
        [mergedArray addObject:dict];
        [existingKeys addObject:keyInDict2]; // 将新添加的key加入到existingKeys集合中
    }
}

// 输出合并后的数组
NSLog(@"Merged Array: %@", mergedArray);

这段代码首先创建了一个可变数组mergedArray,它初始化为包含array1的所有元素。然后创建了一个可变集合existingKeys来存储已经存在的key。我们遍历array1将所有的key添加到existingKeys中。

接下来,我们遍历array2中的每个元素,检查其key是否已经在existingKeys中。如果不在,我们就将这个元素添加到mergedArray中,并将新的key加入到existingKeys集合中。

最后,我们打印出合并后的数组。这样,mergedArray就只包含了不重复key的元素,满足了您的要求。

这种的使用set,分开遍历两个数组,要比双层for循环时间复杂度要低。