剑指offer(十一)

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值