数组(5-8)
数组(5-8)
数组中只出现一次的数字
思路: 从set的角度(set中不允许出现重复元素)
步骤:
- 定义一个set
- 遍历数组,若集合中没有该元素,则将此元素加入set中,若集合中有该元素,则将集合中的该元素删除(数组中出现两次的元素)
- 最终集合中留下的就是只出现一次的元素
ps:找有没有是用的set的find接口,返回的是一个迭代器,若存在返回元素位置,若不存在返回s.end();往set中加入元素用的是insert接口,删除是erase接口
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
set<int> s;
for(int i=0;i<data.size();i++)
{
if(s.find(data[i])==s.end())
{
s.insert(data[i]);
}
else s.erase(data[i]);
}
set<int>::iterator it=s.begin();
*num1=*it;
it++;
*num2=*it;
}
};数组中重复的数字
思路:利用set的特性,set中不允许重复元素
步骤:
1.定义一个set
2.遍历数组,若set中不存在,则往里加,若存在,就返回1,这个数组元素就是第一个重复元素
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
set<int> s;
for(int i=0;i<length;i++)
{
if(s.find(numbers[i])==s.end())
{
s.insert(numbers[i]);
}
else
{
*duplication=numbers[i];
return 1;
}
}
return 0;
}
};连续子数组的最大和
思路:对于第i个位置的元素来说,若它前面的sum是负数,则没有必要加上前面的sum,从当前i开始进行求和;若它前面的sum是正数,那么加上它本身
步骤:
定义一个sum(初始值可以设为a[0])进行求和,再定义一个maxSum(初始值可以设为sum)保存最大和
i从1开始遍历,若前面的sum大于0,则sum=sum+a[i];若前面的sum<0,则sum从a[i]重新开始
每一次循环后都要判断此时sum大于maxSum么,如果大于,就更新maxSum
class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { int sum=array[0]; int maxSum=sum; int length=array.size(); for(int i=1;i<length;i++) { if(sum<=0) { sum=array[i]; } else sum+=array[i]; if(sum>maxSum) { maxSum=sum; } } return maxSum; } };调整数组顺序使奇数位于偶数前面
思路:定义一个奇数数组和偶数数组
步骤:
1.定义两个数组,一个存放奇数,一个存放偶数
2.遍历原数组,若元素为奇数,加入到v1;若元素为偶数,加入到v2
3.清空原数组
4.分别将v1和v2中的元素加入到原数组中去
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int>v1;
vector<int>v2;
for(int i=0;i<array.size();i++)
{
if(array[i]%2==0)
{
v2.push_back(array[i]);
}
else
v1.push_back(array[i]);
}
array.clear();
for(int i=0;i<v1.size();i++)
{
array.push_back(v1[i]);
}
for(int i=0;i<v2.size();i++)
{
array.push_back(v2[i]);
}
}
};
查看7道真题和解析