51. 数组中只出现一次的数字
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
//使用异或的方式,二进制下,出现过两次的数都会相互抵消掉,只留下出现一次的数
//因为有两个数字,将所有数字异或后,会得到这两个数字异或的结果
//分析结果得出两个数字二进制下不同的位置,即异或值为1的位置
//根据该信息将数组分成两部分,分别异或,可得出两值
int temp=0;
for (int i=0;i<data.size();i++){
temp=temp^data[i];
}
int loc=0;
while(temp>0){
if(temp%2) break;
loc++;
temp=temp>>1;
}
*num1=0;
*num2=0;
for (int i=0;i<data.size();i++){
temp=data[i];
temp=temp>>loc;
if(temp&1){
*num1^=data[i];
}
else{
*num2^=data[i];
}
}
}
};
52. 和为S的两个数字
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> res;
if(array.size()<=1) return res;
int low=0,high=array.size()-1;
while(low<high){
if(array[low]+array[high]>sum)
high--;
else if(array[low]+array[high]<sum)
low++;
else{
res.push_back(array[low]);
res.push_back(array[high]);
break;
}
}
return res;
}
};
53. 和为S的连续整数序列
确定序列范围后,从最小的两个值开始遍历,比sum小则结果中加进序列后一位,比sum大则减去结果中最小的一位
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> res;
if(sum<1) return res;
vector<int> temp_res;
//至少包含两个数,所以是从1 到 sum/2+1
int low=1,high=2;
int temp_sum=3;
while(low<high && high<=sum/2+1){
if(temp_sum==sum){
for(int i=low;i<=high;i++)
temp_res.push_back(i);
res.push_back(temp_res);
temp_res={};
temp_sum-=low;
low++;
}
else if(temp_sum<sum){
high++;
temp_sum+=high;
}
else if(temp_sum>sum){
temp_sum-=low;
low++;
}
}
return res;
}
};
54. 翻转单词顺序列
有尝试写简单点,最后删除一下多余的空格,但这样总是出现一个问题说是空格格式或者换行格式出错,不知道问题在哪里。。
class Solution {
public:
string ReverseSentence(string str) {
if(str.empty()) return str;
string res="";
stack<char> temp;
char emp=' ';
for(int i=str.size()-1;i>=0;i--){
if(str[i]!=' '){
temp.push(str[i]);
}
else{
while(!temp.empty()){
char pop1=temp.top();
res.push_back(pop1);
temp.pop();
}
res.push_back(str[i]);
}
}
while(!temp.empty()){
char pop1=temp.top();
res.push_back(pop1);
temp.pop();
}
//res=res.substr(0,res.size()-1);
return res;
}
};
55. 左旋转字符串
class Solution {
public:
string LeftRotateString(string str, int n) {
if(str.size()<=0 || n<0) return "";
string temp;
while(n>str.size())
n-=str.size();
for(int i=0;i<n;i++)
temp.push_back(str[i]);
str=str.substr(n,str.size());
str=str+temp;
return str;
}
};