@[toc]

合并两个有序的数组

题目描述

给出两个有序的整数数组A 和B ,请将数组B 合并到数组A 中,变成一个有序的数组
注意:
可以假设 A数组有足够的空间存放B 数组的元素, A和B 中初始的元素数目分别为 m和n

题解:

将A和B从最后一位开始比,然后存入A中(下标从第m+n-1倒着开始)。当有一个用完后,将另一个数组内的元素全部按顺序存入A中

代码:

class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
        int i = m - 1;
        int j = n - 1;
        int k = m + n - 1;//
        while (i >= 0 && j >= 0)
        {
            if (A[i] > B[j])
            {
                A[k] = A[i];
                i--;
                k--;
            }
            else
            {
                A[k] = B[j];
                j--;
                k--;
            }
        }
        while (i >= 0) A[k--] = A[i--];
        while (j >= 0) A[k--] = B[j--];
    }
};

反转字符串

题目描述

写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

题解:

有reverse现成的翻转函数,直接套进去就可以
如果不用函数的话,也不难,倒着循环str,存入新的string内就行

代码:

class Solution {
public:
    /**
     * 反转字符串
     * @param str string字符串 
     * @return string字符串
     */
    string solve(string str) {
        // write code here
        reverse(str.begin(),str.end());
        return str;
    }
};

子数组的最大累加和问题

题目描述

给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为O(n),空间复杂度为O(1)

题解:

我们从前向后推,如果当前值加上前一个值小于当前值,那我们就不加了,如果大于我就加上,这样维护的是每个位置所能累加的最大值,我们在这个过程中用maxx取最大情况

代码:

class Solution {
public:
    /**
     * max sum of the subarray
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxsumofSubarray(vector<int>& arr) {
        // write code here
        int maxx=arr[0];
        for(int i=1;i<arr.size();i++)
        {
            arr[i]=max(arr[i],arr[i]+arr[i-1]);
            maxx=max(arr[i],maxx);
        }
        return maxx;
    }
};

求平方根

题目描述

实现函数 int sqrt(int x).
计算并返回x的平方根

题解:

要求返回平方根,我们就找一个i,使得ii<=x&&(i+1)(i+1)>x
这样的i就是我们要找的答案
注意,x有可能为负数,当<=0时返回0

代码:

class Solution {
public:
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    int sqrt(int x) {
        // write code here
        if(x<=0)return 0;
        for(int i=1;i<=x;i++)
        {
            if(i*i<=x&&(i+1)*(i+1)>x)return i;
        }
    }
};

数组中只出现一次的数字

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

题解:

用map来记录每个数字出现几次,然后再循环一遍看哪个数字出现一次,赋给num1和num2就行
还有个高级做法是用位运算,异或^,这里就不细讲了

代码:

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        map<int,int>a;
        for(int i=0;i<data.size();i++)
        {
            a[data[i]]++;
        }
        int ans=0;
         for(int i=0;i<data.size();i++)
        {
            if(a[data[i]]==1)
            {
                if(ans==0)*num1=data[i];
                else *num2=data[i];
                ans++;

            }
        }
    }
};