面试被军训汇总(小红书、滴滴、招商银行、快看漫画)

小红书:

手撕算法:
1:给定一个能够随机产生0-6的随机整数的函数,如何根据这个函数产生0-9的随机整数(要求随机性)(凉):
该题思路:
1):我们需要产生两个7进制的数(我们需要获取一个2位数以上的数):假如说我们第一次获得了6,第二次获得了2,那么这个七进制的数就是: 6 ∗ 7 1 + 2 ∗ 7 0 = 44 6*7^1+2*7^0=44 671+270=44(两位数的七进制数最大为66换作十进制为48: 6 ∗ 7 1 + 6 ∗ 7 0 6*7^1+6*7^0 671+670
2) :我们要将这个七进制的数转化成10进制的数即: a ∗ 1 0 1 + b ∗ 1 0 0 a*10^1 +b*10^0 a101+b100,为了保证0-9出现的概率一致,40(十进制)以上的数字可能有两种七进制组合,所以我们这里需要进行判断来获取真正的随机(即概率一致),解题思路参考

int rand7()	//七进制数字产生函数
int rand10(){
   
	int i=rand7();
	int j=rand7();
	int ten=i*7+j;
	if(ten>=40){
   
		return rand10();//这里继续调用rand10()的原因是为了真正的使得产生的数随机等概率
	else{
   
		return ten%10;
		}
	}
}

将0-6看作是七进制的数,同样的,0-9看作是10进制,这里主要实现的功能就是进制的转化

2:给定一个数组(可能会有重复值),收集其中三个数之和为0的所有可能:
该题思路:
1):将数组(data)进行排序(随便一种算法排序,重点不在这),然后定义三个标签,(begin、find、end)
2):使用最大值与最小值进行求和,我们得到了两个值的结果(result),然后再去判断这个值是否会出现在该数组中即可
代码实现:

vector<int> getresult(vector<int> data){
   
	vector<vector<int> > result;
	vector<int> used;
	int begin=0,find=0,end=data.size()-1;
	for(int i=0;i<data.size()-3;i++)
	{
   
		begin=i,end=data.size()-1;
		if(vector<int>::iterator find(used.begin(),used.end(),data[i])!=data.end())
			continue;	//用来判断data[begin]这个元素是否已经使用过了,防止出现重复
		used.push_back(data[begin];
		while(begin!=end)
		{
   
			int sum=data[begin]+data[end];
			if (sum<data[begin])
				begin++;
			else if(sum>data[end])
				end--;
			else
			{
   
				vector<int> res(3,0);
				int find=begin+1;
				while(find<end){
   
					if (data[find]==sum){
   
						res[0]=data[begin];
						res[1]=data[find];
						res[2]=data[end];
						find=end;
						result.push_back(res);
					}
					find++;
				}
				end--;
				while(data[end+1]==data[end])
					end--;
			
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值