MS题目-hby

本文深入探讨了C++中new和delete的区别,解释了如何正确使用它们进行内存管理。同时,介绍了strtok函数的实现原理,用于演示字符串分割的方法。还通过实例分析了如何在N个数中找到第K大的数,以及解决概率游戏问题的思路。最后,讨论了洗牌算法以确保特定元素不在指定位置的应用。

1.delete和delete[]有什么区别,为什么delete一个不够

当你使用new时,有两件事会发生。第一,内存被配置(透过函数operator new)。第二,会有一个(或以上)的constructors针对此内存被调用。当你使用delete时,也有两件事发生:一个(或以上)的destructors会针对此内存被调用,然后内存被释放(透过函数operator delete)。如果你使用delete是未加括号,delete便假设删除对象是单一对象。否则便假设删除对象是个数组。

2.实现C的库函数strtok

trtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回被分割出片段的指针。

3.在N个数的第K大数

 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)

4.游戏:有3个盒子,其中一个有奖,假定你一开始选择了一个盒子;主持人知道那个盒子有奖,这时主持人从另外两个盒子中选了一个没有奖的盒子打开,请问这时候你应该换一个盒子以使获奖的概率增大吗?

5.有两个已经排好序的数组a1和a2,求这两个数组合起来第k大得数,要求时间复杂度尽量小

6.有N个人编号1..N,N的礼物编号1..N,写出一个算法,使第K个人不拿第K个礼物,假定输入为a[1..N]=[1..N],其实就是将a洗牌,使a[k]!=k;假定每个人拿到与自己编号不同的礼物的概率相等呢,又应该怎样洗牌。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值