C++数组索引值自增操作的Objective-C等价实现疑问
嘿,我来帮你把这个问题掰扯清楚~
先搞懂
cnt[d[i]]++到底啥意思 这个C++表达式其实就是个数值计数操作,拆解开看就明白:
d[i]:取数组d里第i个位置的数值,比如你给的例子d[0]=4,那这里就是4;cnt[d[i]]:访问计数数组cnt中索引等于d[i]的元素,也就是cnt[4];++:后置自增,意思是先拿当前cnt[d[i]]的值来用(如果有需要的话),再把这个元素的数值加1。比如你说cnt[4]=2,执行完cnt[d[0]]++后,cnt[4]就变成3了。
整体作用就是统计d数组里每个数值出现的次数——每碰到一个数值x=d[i],就把计数数组里对应x位置的数字加1。
你的Objective-C代码为啥有问题?
看你写的OC代码,有个致命问题:你初始化了NSMutableArray *d = [NSMutableArray new];,但这个数组是空的啊!然后直接在循环里[d objectAtIndex:i],这肯定会触发数组越界崩溃,因为d里啥元素都没有。
另外还有个小坑:如果cnt是局部变量的话,C风格数组默认是随机值,不是0,这会导致你的计数完全不准,必须手动初始化。
正确的Objective-C实现方式
方式1:沿用C风格数组(和C++逻辑完全一致)
这种方式最贴近你原来的C++代码,OC完全兼容C语法,所以直接用就行,注意先给d数组填元素,初始化cnt:
// 初始化计数数组,全部置为0(局部变量必须做这个,全局数组会默认初始化为0) int cnt[100001] = {0}; int ans = 0; int N = 4; // 先给d数组填充示例元素,比如模拟你说的d[0]=4的场景 NSMutableArray *d = [NSMutableArray arrayWithObjects:@4, @4, @2, @4, nil]; for(int i = 0; i < N; i++){ int dOfI = [[d objectAtIndex:i] intValue]; // 这里和C++的cnt[d[i]]++完全等价,直接用就行 cnt[dOfI]++; if(ans < cnt[dOfI]){ ans = cnt[dOfI]; } } NSLog(@"出现次数最多的数值次数是:%d", ans); // 这里会输出3,因为4出现了3次
方式2:用Objective-C的NSMutableDictionary(更灵活)
如果你的数值范围不确定,不想用固定大小的C数组,用字典来计数更合适:
int ans = 0; int N = 4; NSMutableArray *d = [NSMutableArray arrayWithObjects:@4, @4, @2, @4, nil]; NSMutableDictionary *countDict = [NSMutableDictionary dictionary]; for(int i = 0; i < N; i++){ NSNumber *num = d[i]; // 获取当前计数,没有的话默认是0 NSInteger currentCount = [countDict[num] integerValue]; currentCount++; countDict[num] = @(currentCount); if(currentCount > ans){ ans = currentCount; } } NSLog(@"出现次数最多的数值次数是:%d", ans); // 同样输出3
最后总结下
cnt[d[i]]++的核心就是给d数组里的每个数值做计数累加,用C风格数组的话OC里直接照搬语法就行;- 你原来的OC代码崩溃是因为
d数组为空就取值,一定要先给d加元素; - 局部C数组记得初始化,不然会有随机值干扰计数;
- 用OC字典的话更灵活,适合数值范围不固定的场景。
内容的提问来源于stack exchange,提问作者user6298177
相关产品推荐
相关产品推荐

