剑指offer3-5题

#include <iostream>
using namespace std;

#include "vector"

class Solution3_1 {
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) {
        if (numbers == nullptr || length <= 0)
            return false;
        for (int i=0 ; i<length ; i++)
        {
            if (numbers[i] < 0 || numbers[i] > length-1)
                return false ;
        }
        for (int i = 0 ; i<length ; i++)
        {
            while (i != numbers[i])
            {
                if (numbers[i] != numbers[numbers[i]])
                {
                    swap (numbers[i],numbers[numbers[i]]);
                }
                else
                {
                    *duplication = numbers[i];
                    return true;
                }
            }
        }
        return false;
    }

};

class Solution3_2 {
public:
    int duplicateInArray(vector<int>& nums) {
        int n=nums . size();
        for  (auto x: nums)
        {
            if (x<0||x>n-1)return -1;
        }
        for (int i = 0 ;i < n ; i++)
        {
            while (i != nums[i] && nums[i] != nums[nums[i]]) swap (nums[i],mums[nums[i]]);
            if (i != nums[i] && nums[i] == nums[nums[i]]) return nums[i];
        }
    return -1;
    }
};
class Solution3_3 {
public:
    int duplicateInArray(vector<int>& nums) {
        int l = 1, r=nums.size() - 1;
        while (l < r)
        {
            int mid = l + r >> 1 ; //[1.mid] [mid+1 ,r]
            int s= 0;
            for (auto x :nums)
                s += x >=l && x <= mid ;
            if (s > mid - l + 1) r = mid ;
            else l = mid + 1 ;

        }
        return r;


    }
};

class Solution4_1 {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        if (array.empty() || array[0].empty())
            return false;
        int i = 0 ,j = array.size() - 1 ;
        while (i < array.size() && j >= 0)
        {
            if (array[i][j] == target)
                return true;
            if (array[i][j] > target)
                j --;
            else i ++;
        }
        return false ;
    }
};

class Solution5_1 {
public:
    string replaceSpaces(string &str) {

        string res ;
        for (auto x : str)
        {
            if (x == ' ')
                res += "%20";
            else
                res += x ;
        }

    }
};
class Solution5_2  {
public:
    void replaceSpace(char *str,int length) {
        if (str == nullptr || length <= 0)
        {
            return ;
        }
        int originalLength = 0 ;
        int numberOfBlank = 0 ;
        int i= 0 ;
        while (str[i] != '\0')//统计有多少字符,有多少个空格
        {
            ++originalLength;
            if (str[i] == ' ')
                ++numberOfBlank;
            ++i;
        }
        int newLength = originalLength + numberOfBlank * 2 ;
        if (newLength > length) return ;
        int indexOfOrignal = originalLength;
        int indexOfNew = newLength;
        while (indexOfOrignal >=0 && indexOfNew > indexOfOrignal)
        {
            if (str[indexOfOrignal]== ' ')
            {
                str[indexOfNew --] = '0';
                str[indexOfNew --] = '2';
                str[indexOfNew --] = '%';
            }
            else
            {
                str[indexOfNew --] = str [indexOfOrignal];
            }
        --indexOfOrignal;
        }
    }
};

class Solution_refer {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p1 = m - 1 ;
        int p2 = n - 1 ;
        int p = m + n - 1 ;
        while ( p1 >= 0 && p2 >= 0)
        {
            nums1[p--]= (nums1[p1] < nums2[p2] ? nums2[p2--] : nums1[p1--]);
        }
    while  (p2 >= 0){
        nums1[p--]= nums2[p2--];
    }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值