zoukankan      html  css  js  c++  java
  • 剑指Offer常见问题整理

    1 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。(来自牛客网,剑指offer)

    #include <iostream>
    #include <vector>
    std::vector<std::vector<int>> s;
    void init(int n) {
        int pos = n*2;
        for (int i = 0; i < n; ++i) {
            std::vector<int> tmp;
            for (int j = pos; j < pos + n; ++j) {
                tmp.push_back(j);
            }
            pos = pos + n;
            s.push_back(tmp);
            tmp.clear();
        }
    }
    
    void print(std::vector<std::vector<int>> &s, int n) {
        for (int i=0; i < n; ++i) {
            for (auto itr:s[i]) {
                std::cout << itr << ",";
            }
            std::cout << "
    ";
        }
    }
    
    std::pair<int, int> find(std::vector<std::vector<int>> &s, int dst) {
        int line_cnt = s[0].size();
        int col_cnt = s.size();
    
        int low = 0;
        int high = col_cnt - 1;
        int nMid = (low + high) / 2;
        // 可能的列
        int sus_col_pos = -1;
        while (low <= high) {
            nMid = (low + high) / 2;
            if (s[nMid][0] <= dst && s[nMid][s[nMid].size()-1] >= dst) {
                sus_col_pos = nMid;
                break;
            } else if (s[nMid][s[nMid].size()-1] < dst) {
                low = nMid + 1;
            } else {
                high = nMid - 1;
            }
        }
    
        //std::cout<< sus_col_pos;
        // 二分找到了列, 对行进行二分查找
        low = 0;
        high = s[sus_col_pos].size()-1;
        int dst_pos = -1;
        while (low <= high) {
            int nMid = (low + high) / 2;
            if (s[sus_col_pos][nMid] == dst) {
                dst_pos = nMid;
                break;
            } else {
                if (s[sus_col_pos][nMid] > dst) {
                    high = nMid - 1;
                } else {
                    low = nMid + 1;
                }
            }
        }
        return std::make_pair(sus_col_pos, dst_pos);
    }
    
    int bi_search(int a[], int low, int high, int dst) {
        int nMid = (low + high) / 2;
        while(low <= high) {
            nMid = (low + high) / 2;
            if (a[nMid] ==  dst) {
                return nMid;
            } else {
                if (a[nMid] > dst) {
                    high = nMid - 1;
                } else {
                    low = nMid + 1;
                }
            }
        }
        return nMid;
    }
    
    std::ostream &operator<< (std::ostream &out, std::pair<int, int> &s) {
        //std::cout << "(" << s.first << "," << s.second << ")" << "
    ";
        out << "(" << s.first << "," << s.second << ")" << "
    ";
        return out;
    }
    int main() {
        init(5);
        print(s, 5);
        std::pair<int, int> res = find(s, 34);
        std::cout << res;
        // std::cout << find(s, 20).first;
    //    int a[] = {2, 4, 6, 34, 90};
    //    std::cout << bi_search(a, 0, 4, 5);
        return 0;
    }
    

      

    请实现一个函数,将一个字符串中的空格替换成“ % 20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
    //注意如果输出的是%20d需要对%进行转义

    //用Stl中的vector时间复杂度为:O(str.length());空间复杂度O(str.length+3*SpaceNum)

     1 void ReplaceSpace( string strSrc,char *sOut)
     2 { 
     3     vector<char> cOut;
     4     const char *pStr = strSrc.data();
     5     while (*pStr != '')
     6     {
     7         if (*pStr == ' ')
     8         {
     9             cOut.push_back('%');
    10             cOut.push_back('2');
    11             cOut.push_back('0');
    12         }
    13         else
    14             cOut.push_back(*pStr);
    15         pStr++;
    16     }
    17     cOut.push_back('');
    18 
    19     for (int i = 0; i < cOut.size(); i++)
    20     {
    21         sOut[i] = cOut[i];
    22     }
    23 
    24 }
    25 
    26 //Test
    27   string str= "ni hao ma";
    28     char pStr[32] = {0};
    29     ReplaceSpace(str,pStr);
    30     printf("%s",pStr);
    31     getchar();
    32     return 0;
    除特殊说明外,其余所有文章均属原创。未经允许,请勿进行转载或者其他操作 有问题欢迎留言交流
  • 相关阅读:
    洛谷
    洛谷
    NOIP 普及组 2014 螺旋矩阵
    NOIP 普及组 2014 珠心算测验
    hdu 1114Piggy-Bank(完全背包)
    hdu 2059龟兔赛跑("01"背包)
    洛谷 P1282 多米诺骨牌("01"背包)
    洛谷 P1140 相似基因(DP)
    洛谷 P1880 [NOI1995] 石子合并(区间DP)
    洛谷 P1280 尼克的任务
  • 原文地址:https://www.cnblogs.com/LiuBingBlogs/p/8681922.html
Copyright © 2011-2022 走看看