面试题小记:1、统计字符串出现的次数,2、约瑟夫环问题

今天面到了一个比较有意思的笔试题,先记录一下:
1.字符串类似‘aaabbccddd’,写个方法得出'3a2b2c3d',即统计字符串出现的个数
$arr = str_split('aaabbccddd');
$n = 1;
$finalStr = '';
for($i = 0;$i<count($arr);$i++){
if(($i < count($arr)-1) && $arr[$i] == $arr[$i+1]){
$n++;
}else{
$finalStr .= $n.$arr[$i];
$n = 1;
}
}
echo $finalStr;
当时答题的时候,str_split的用法记错了,导致没出正确结果....

2.约瑟夫环问题
function circle($n,$m) {
$c=0;
for($i=2; $i<=$n; $i++) {
$c=($c+$m)%$i;
}
return $c+1;
}
echo circle(50,3);

转载于:https://blog.51cto.com/linlin2017/2167158

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Arraylist和HashMap在遍历的时候插入数据会引起并发修改异常,因为它们两个都是不同步的,当其他线程在迭代器上修改元素时,会造成冲突。因此,如果要在遍历的时候插入元素,建议使用线程安全的集合,比如CopyOnWriteArrayList和ConcurrentHashMap。 ### 回答2: 当ArrayList和HashMap正在遍历时插入元素会导致两种不同的问题。 对于ArrayList来说,当我们在遍历ArrayList时插入元素,会导致ConcurrentModificationException(并发修改异常)的抛出。这是因为ArrayList在遍历时使用一个迭代器(Iterator)来获取元素,并且在每次调用迭代器的next()方法时都会检查modCount(修改次数)是否与预期一致,如果不一致则抛出异常。而插入元素会增加modCount的值,导致modCount与预期不一致,从而引发异常。 对于HashMap来说,当我们在遍历HashMap时插入元素,不会抛出ConcurrentModificationException异常,但会导致遍历过程出现不可预测的结果,可能会漏掉一些元素或者重复遍历某些元素。这是因为HashMap的遍历过程是通过entrySet()方法返回的迭代器来实现的,而且插入元素可能会导致HashMap的结构发生变化,从而影响迭代器的操作。在HashMap的实现,如果在遍历过程发现结构发生变化,会通过fail-fast机制立刻抛出ConcurrentModificationException异常,但并不是所有情况下都能及时检测到结构变化。 因此,在遍历ArrayList和HashMap时,最好避免在遍历过程插入元素,可以通过在遍历前或者遍历后进行元素的插入操作,或者选择使用线程安全的数据结构来避免这个问题。 ### 回答3: 在使用ArrayList和HashMap时,如果在遍历的过程进行插入操作,可能会导致遍历出现问题。 对于ArrayList,当我们使用迭代器或者for循环进行遍历时,如果在遍历过程进行插入操作,可能会导致ConcurrentModificationException(并发修改异常)的出现。这是因为ArrayList在进行插入操作时,会修改内部的modCount(修改次数)属性,而迭代器或者for循环会在每次迭代时检查modCount的值是否一致,如果不一致则抛出该异常。 对于HashMap,同样在使用迭代器或者for-each循环进行遍历时,如果在遍历过程进行插入操作,可能会导致ConcurrentModificationException的出现。HashMap的遍历是基于Entry数组实现的,当进行插入操作时,会导致数组的大小发生改变或者原有的元素位置发生改变。而迭代器或者for-each循环在每次迭代时,都会通过比较modCount判断HashMap是否发生了结构性的改变,如果发生了改变则抛出该异常。 因此,在遍历ArrayList和HashMap时,如果要进行插入操作,可以考虑使用Iterator的add方法或者使用扩展增强for循环,它们能够避免ConcurrentModificationException的异常出现。另外,如果需要并发操作,可以考虑使用并发集合类如CopyOnWriteArrayList和ConcurrentHashMap来避免出现并发修改异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值