389.Find the Difference(找不同)

题目描述

给定两个字符串 s 和 t ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

问题分析

根据题目描述我们可以知道,因为t是s重排之后添加一个字符得到的,所以如果删去添加的字符的话,t应该和s中字符出现的次数一样,但是因为额外添加了一个所以,某一个字符应该比s中对应的字符出现的次数多一次,由此可以写出下面的代码。

代码

char findTheDifference(char* s, char* t) {
    int a[26]={0};
    for(int i = 0; s[i]!='\0'; i++){
        a[s[i]-'a']++;
    }
    for(int i = 0; t[i]!='\0'; i++){
        a[t[i]-'a']--;
    }
    for(int i=0; i<26; i++){
        if(a[i]<0){
            return i+'a'; 
        }
    }
    return 0;
}

提交结果截图

在这里插入图片描述

### 使用 `redisTemplate.opsForSet().difference` 出两个 Set 集合中的相同元素 在 Redis 中,`redisTemplate.opsForSet().difference` 方法用于计算两个集合的差集。然而,若需要出两个集合中的相同元素,应使用交集操作而非差集[^4]。 可以通过 `redisTemplate.opsForSet().intersect` 方法来获取两个集合的交集,从而到它们的相同元素: ```java @Test public void findCommonElements() { Set<Object> common = redisTemplate.opsForSet().intersect("set1", "set2"); common.forEach(item -> { System.out.println("Common item: " + item); }); } ``` 此方法会返回两个集合的交集,即包含所有同时存在于 `set1` 和 `set2` 中的元素。 ### 优化处理大缓存的性能 当集合中存储的数据量较大时,执行交集、差集等操作可能会对性能产生影响。为了优化处理大缓存的性能,可以采用以下策略: #### 分批处理与迭代遍历 对于非常大的集合,直接使用 `members` 获取所有元素可能导致内存压力。此时可以使用 `SSCAN` 命令或对应的 `redisTemplate` 方法进行分批迭代: ```java Cursor<Object> cursor = redisTemplate.opsForSet().scan("set1", ScanOptions.scanOptions().build()); while (cursor.hasNext()) { Object item = cursor.next(); // 处理单个元素 } ``` 这种方式可以避免一次性加载所有数据到内存中,从而降低内存消耗并提升系统稳定性。 #### 使用 Lua 脚本减少网络往返 将多个 Redis 操作封装在 Lua 脚本中,可以在服务器端一次性完成计算,减少客户端与服务端之间的通信次数。例如,以下 Lua 脚本可以计算两个集合的交集: ```lua local set1 = redis.call('SMEMBERS', KEYS[1]) local result = {} for i, v in ipairs(set1) do local is_member = redis.call('SISMEMBER', KEYS[2], v) if is_member == 1 then table.insert(result, v) end end return result ``` 在 Java 中调用该脚本的方式如下: ```java DefaultScriptExecutor scriptExecutor = new DefaultScriptExecutor(redisTemplate.getConnectionFactory()); Object result = scriptExecutor.execute(new DefaultRedisScript<>(luaScript, List.class), "set1", "set2"); List<String> commonElements = (List<String>) result; commonElements.forEach(item -> { System.out.println("Common item: " + item); }); ``` 这种方式减少了多次调用 `SISMEMBER` 的网络开销,提高了整体效率[^3]。 #### 合理选择数据结构 如果频繁需要判断两个集合的交集,建议保持数据以 Set 形式存储,并通过内置的集合运算命令(如 `SINTERSTORE`)进行高效处理。例如,可以将交集结果保存到新的集合中,以便后续快速访问: ```java redisTemplate.opsForSet().intersectAndStore("set1", "set2", "intersectionSet"); ``` 这种方法利用了 Redis 内部优化的集合运算逻辑,适用于大规模数据处理场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值