目录
- 前言
- 正文
- 1. [大数相加](https://blog.csdn.net/fesdgasdgasdg/article/details/80953829)
- 2. [10亿int型数,统计只出现一次的数](https://blog.csdn.net/u010983881/article/details/75097358)
- 3. 给定一个无序数组,建一个最大堆。
- 4. [返回峰值](https://leetcode-cn.com/problems/find-peak-element/)
- 5. 连续子数组的最大和
- 6. [寻找两个正序数组的中位数](https://leetcode-cn.com/problems/median-of-two-sorted-arrays/)
- 7. 下一个排列
- 参考
前言
正文
1. 大数相加
code
string add(string str_1,string_2)
{
string result;
string temp;
bool carryFlag = false;
string maxString=(str_1.size()>=str_2.size())?str_1:str_2;//先得到较长,较短字符串的长度
string minString=(str_1.size()<str_2.size())?str_1:str_2;
//将短字符串补齐到和长字符串一样长,在短字符串前边补上字符0
int maxLength = maxString.size();
int minLength = minString.size();
temp.append((maxLength-minLength),'0').append(minString);
minString.clear();
minString.append(temp);
//字符串进行倒序遍历,按位相机
for(int i=(maxString.size()-1);i>=0;i--)
{
int res;
if(carryFlag)//看一下上一位是否有进位,若有进位要进行加一
res=(maxString[i]-48)+(minString[i]-48)+1;
else
res=(maxString[i]-48)+(minString[i]-48);
if(res<10)//res是否小于10
carryFlag = false;
ese
carryFlag = true;
result.push_back((res%10)+48);//然后将当前的这个值存入result之中
}
if(carryFlag)//若最后一位还有进位,那么就直接在该结果上加一
result.push_back(49);
reverse(result.begin(),result.end());//接下来,翻转整个数组
return result;
}
2. 10亿int型数,统计只出现一次的数
思路:
位图法:用bit来标识一个int整数。
分治法:分批处理这10亿的数值。
3. 给定一个无序数组,建一个最大堆。
priority_queue<int,vector>这个是堆的表达式
code
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
//采用最小堆的方式
vector<int> arr;
if(input.size()==0||k==0||k>input.size())
return arr;
priority_queue<int,vector<int>> que;//实现优先队列的数据结构,底层实现堆实现 priority_queue<Type,Container,Functional> Type为数据类型,Container为保存数据的容器,Functional为元素比较方式,若不写后两个元素,则容器默认是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大。
for(auto x:input)
{
if(que.size()<k)
{
que.push(x);
}
else
{
if(x>que.top())
{
que.pop();
que.push(x);
}
}
}
while(!que.empty())
{
arr.push_back(que.top());
que.pop();
}
return arr;
}
};
4. 返回峰值
5. 连续子数组的最大和
题目
code
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int s = 0;
int res = INT_MIN;
for(auto x:nums)
{
if(s<0)//这个的动作就相当于把所有的负数都剔除了。只加正数,可不就得到的就是最大值。
s = 0;
s+=x;
res = max(s,res);
}
return res;
}
};
6. 寻找两个正序数组的中位数
题目
code
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int size1 = nums1.size();
int size2 = nums2.size();
int middle1 = INT_MIN;
int middle2 = INT_MAX;
int total = size1+size2;
int index1 = 0;
int index2 = 0;
for(int i = 0;i<=total/2;i++)//error1:<=
{
middle1 = middle2;
if(index2>=size2||(index1<size1&&(nums1[index1]<nums2[index2])))//这里index2>=size2就可以进去了,不然,有可能会走另一条路,导致数组越界
{
middle2 = nums1[index1++];
}
else
{
middle2 =nums2[index2++];
}
}
if(total%2==0)
return (middle1+middle2)/2.0;//error:这里的2.0表示说精确到小数点后一位,很神
return middle2;
}
};
7. 下一个排列
题目
code
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if(nums.size()==0)
return;
int len = nums.size();
for(int i = len-1;i>=0;i--)
{
if(i==0)
{
sort(nums.begin(),nums.end());
return;
}
else if(nums[i]>nums[i-1])
{
//一旦出现后一个数字比前一个大,说明存在更大的证书
sort(nums.begin()+i,nums.end());
for(int j = i;j<len;j++)
{
//由于从i开始后面已经排序
//那么保证获得比nums[i-1]大的数,是[i->len-1]中最小的,交换即可
if(nums[j]>nums[i-1])
{
int temp = nums[i-1];
nums[i-1] = nums[j];
nums[j] = temp;
return ;
}
}
}
}
}
};