草庐IT

剑指offer第一阶段题解

Login_X's Blogs 2023-03-28 原文

牛客-剑指offer题解第一阶段

考察点汇总

数组,贪心,二分,归并排序,动态规划

二维数组中的查找

题目

考察点:思路

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.size()==0)
            return false;
        if(array[0].size()==0)
            return false;
        int n=array.size();
        int m=array[0].size();
        for(int i=0,j=m-1;i<n&&j>=0;)
        {
            if(target>array[i][j])
                i++;
            else if(target<array[i][j])
                j--;
            else
                return true;
        }
        return false;
    }
};

旋转数组的最小数字

题目

考察点:二分

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int left=0,right=rotateArray.size()-1;
        while(left<right)
        {
            int mid=(left+right)/2;
            if(rotateArray[mid]>rotateArray[right])
                left=mid+1;
            else if(rotateArray[mid]<rotateArray[right])
                right=mid;
            else
                right--;
        }
        return rotateArray[left];
    }
};

调整数组顺序使奇数位于偶数前面

题目

考察点:思路

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> reOrderArray(vector<int>& array) {
        int n=array.size();
        vector<int> array1(n);
        int odd=0;
        for(int i=0;i<n;i++)
            if(array[i]%2)
                odd++;
        int index1=0,index2=odd;
        for(int i=0;i<n;i++)
        {
            if(array[i]%2)
                array1[index1++]=array[i];
            else
                array1[index2++]=array[i];
        }
        return array1;
    }
};

顺时针打印矩阵

题目

考察点:思路

class Solution {
  public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> res;
        if (matrix.size() == 0)
            return res;
        int up = 0;
        int down = matrix.size() - 1;
        int left = 0;
        int right = matrix[0].size() - 1;
        while (up <= down && left <= right) {
            for (int i = left; i <= right; i++)
                res.push_back(matrix[up][i]);
            up++;
            if (up > down)
                break;

            for (int i = up; i <= down; i++)
                res.push_back(matrix[i][right]);
            right--;
            if (left > right)
                break;

            for (int i = right; i >= left; i--)
                res.push_back(matrix[down][i]);
            down--;
            if (up > down)
                break;

            for (int i = down; i >= up; i--)
                res.push_back(matrix[i][left]);
            left++;
            if (left > right)
                break;
        }
        return res;
    }
};

数组中出现次数超过一半的数

题目

考察点:哈希,思路

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int n=numbers.size();
        unordered_map<int,int> mp;
        for(int i=0;i<n;i++)
        {
            mp[numbers[i]]++;
            if(mp[numbers[i]]>n/2)
                return numbers[i];
        }
        return 0;
    }
};

连续子数组的最大和

题目

考察点:动态规划,贪心

class Solution {
  public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int n = array.size();
        vector<int> dp(n, 0);
        dp[0] = array[0];
        int maxn=dp[0];
        for (int i = 1; i < n; i++)
        {
            dp[i]=max(dp[i-1]+array[i],array[i]);
            maxn=max(maxn,dp[i]);
        }
        return maxn;
    }
};

把数组排成最小的数

题目

考察点:贪心,排序

class Solution {
public:
    static bool cmp(string a,string b){
        return a+b<b+a;
    }
    //C++11的话直接用to_string(int n)
    static string toString(int n){
        if(n==0)
            return "0";
        string str="";
        int m;
        while(n){
            m=n%10;
            n/=10;
            str+=('0'+m);
        }
        reverse(str.begin(),str.end());
        return str;
    }
    string PrintMinNumber(vector<int> numbers) {
        string res="";
        vector<string> strs;
        for(int i=0;i<numbers.size();i++)
            strs.push_back(toString(numbers[i]));
        sort(strs.begin(),strs.end(),cmp);
        for(int i=0;i<strs.size();i++)
            res+=strs[i];
        return res;
    }
};

数组中的逆序对

题目

考察点:归并排序

class Solution {
  public:
    int mod = 1000000007;
    int merge(int left, int right, vector<int>& data, vector<int>& temp) {
        //终止条件
        if (left >= right)
            return 0;
        //为防止left+right超出整形范围可以这样写left+(right-left)/2
        int mid = (left + right) / 2;
        int res = merge(left, mid, data, temp) + merge(mid + 1, right, data, temp);
        res %= mod;
        int i = left, j = mid + 1;
        for (int k = left; k <= right; k++)
            temp[k] = data[k];
        for (int k = left; k <= right; k++) {
            if (i == mid + 1)
                data[k] = temp[j++];
            else if (j == right + 1 || temp[i] < temp[j])
                data[k] = temp[i++];
            else{
                data[k] = temp[j++];
                res += mid + 1 - i;
            }
        }
        return res%mod;
    }
    int InversePairs(vector<int> data) {
        int n = data.size();
        vector<int> temp(n);
        return merge(0, n - 1, data, temp);
    }
};

数字在升序数组中出现的次数

题目

考察点:二分

class Solution {
public:
    int find(vector<int>& data,double k){
        int left=0;
        int right=data.size()-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(data[mid]>k)
                right=mid-1;
            else
                left=mid+1;
        }
        return left;
    }
    int GetNumberOfK(vector<int> data ,int k) {
        return find(data,k+0.5)-find(data,k-0.5);
    }
};

数组中只出现过一次的两个数字

题目

考察点:位运算,哈希

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        unordered_map<int,int> mp;
        vector<int> res;
        for(int i=0;i<array.size();i++)
            mp[array[i]]++;
        for(int i=0;i<array.size();i++)
            if(mp[array[i]]==1)
                res.push_back(array[i]);
        if(res[0]<res[1])
            return res;
        return {res[1],res[0]};
    }
};

数组中的重复数字

题目

考察点:思路

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
        set<int> res;
        for(int i=0;i<numbers.size();i++)
            if(!res.insert(numbers[i]).second) return numbers[i];
        return -1;
    }
};

构建乘积数组

题目

考察点:思路

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        vector<int> res(A.size(),1);
        //前缀和
        for(int i=1;i<A.size();i++)
            res[i]=res[i-1]*A[i-1];

        //后缀和
        int ans=1;
        for(int i=A.size()-1;i>=0;i--){
            res[i]*=ans;
            ans*=A[i];
        }
        return res;
    }
};

有关剑指offer第一阶段题解的更多相关文章

  1. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

  2. ruby - 如何跳过 CSV 文件的第一行并将第二行作为标题 - 2

    有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|

  3. arrays - 在一行中选择数组的第一个和最后一个元素 - 2

    我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,

  4. ruby-on-rails - Ruby 或 Rails 有只将第一个字符大写的方法吗? - 2

    或者好像我必须自己写方法?(保持DHA不变):ruby-1.9.2-p180:001>s='omega-3(DHA)'=>"omega-3(DHA)"ruby-1.9.2-p180:002>s.capitalize=>"Omega-3(dha)"ruby-1.9.2-p180:003>s.titleize=>"Omega3(Dha)"ruby-1.9.2-p180:005>s[0].upcase+s[1..-1]=>"Omega-3(DHA)" 最佳答案 如果我的回答只是垃圾,我深表歉意(我不做ruby)。但我相信我已经为您找到了答

  5. ruby - gsub 删除第一个逗号前的所有内容 - 2

    我有这个字符串:auteur="comtedeFlandreetHainaut,Baudouin,Jacques,Thierry"我想删除第一个逗号之前的所有内容,即在这种情况下保留“Baudouin,Jacques,Thierry”试过这个:nom=auteur.gsub(/.*,/,'')但这会删除最后一个逗号之前的每个逗号,只保留“Thierry”。 最佳答案 auteur.partition(",").last#=>"Baudouin,Jacques,Thierry" 关于rub

  6. ruby-on-rails - Order Hash 并删除第一个键值对 - 2

    我有一个以时间戳为键的哈希。hash={"2016-05-31T22:30:58+02:00"=>{"path"=>"/","method"=>"GET"},"2016-05-31T22:31:23+02:00"=>{"path"=>"/tour","method"=>"GET"},"2016-05-31T22:31:05+02:00"=>{"path"=>"/contact_us","method"=>"GET"}}我订购了这个系列并得到了第一双这样的:hash.sort_by{|k,_|k}.first.first但是我该如何删除它呢?删除方法requiresyou知道key的准确

  7. arrays - 字符串数组中字符串第一部分的总和 - 2

    我有一个字符串数组,我需要从中提取第一个单词,将它们转换为整数并获得它们的总和。示例:["5Apple","5Orange","15Grapes"]预期输出=>25我的尝试:["5","5","15"].map(&:to_i).sum 最佳答案 我从你的问题中找到了答案。["5Apple","5Orange","15Grapes"].map(&:to_i).sum在数组中,如果存在任何整数可转换值,那么它将自动转换为整数。 关于arrays-字符串数组中字符串第一部分的总和,我们在Sta

  8. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  9. ruby-on-rails - Rails 3 : Looping through array of objects, 忽略数组中的第一个对象? - 2

    在我看来,我正在尝试显示一个对象表,这是我的代码:CategoriesCBB's">然而这是抛出一个错误说:can'tconvertCapabilityBuildingBlockintoArray关系是正确的,错误来self尝试在此处减去数组的第一个对象的行:有什么方法可以忽略数组中的第一个对象来遍历数组吗?谢谢 最佳答案 尝试使用Array.drop-http://www.ruby-doc.org/core/classes/Array.html#M000294 关于ruby-on-ra

  10. ruby-on-rails - 我如何跳过前三行而不是 FasterCSV 中的第一行 - 2

    我正在使用FasterCSV我正在循环使用这样的foreachFasterCSV.foreach("#{Rails.public_path}/uploads/transfer.csv",:encoding=>'u',:headers=>:first_row)do|row|但问题是我的csv将前3行作为标题...有什么方法可以使fasterCSV跳过前三行而不是仅跳过第一行?? 最佳答案 不确定FasterCSV,但在Ruby1.9标准CSV库(由FasterCSV制作)中,我可以执行以下操作:c=CSV.open'/path/to/

随机推荐