小红书:
手撕算法:
1:给定一个能够随机产生0-6的随机整数的函数,如何根据这个函数产生0-9的随机整数(要求随机性)(凉):
该题思路:
1):我们需要产生两个7进制的数(我们需要获取一个2位数以上的数):假如说我们第一次获得了6,第二次获得了2,那么这个七进制的数就是: 6 ∗ 7 1 + 2 ∗ 7 0 = 44 6*7^1+2*7^0=44 6∗71+2∗70=44(两位数的七进制数最大为66换作十进制为48: 6 ∗ 7 1 + 6 ∗ 7 0 6*7^1+6*7^0 6∗71+6∗70)
2) :我们要将这个七进制的数转化成10进制的数即: a ∗ 1 0 1 + b ∗ 1 0 0 a*10^1 +b*10^0 a∗101+b∗100,为了保证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--;