剑指offer(数组、字符串)及其它答案

数组

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

// 12min17s
class Solution {
 public:
  void reOrderArray(std::vector<int> &arr) {
    std::vector<int> odd, even;
    // 将奇数和偶数分别存入vector
    int arr_len = arr.size();
    for (int i = 0; i < arr_len; ++i) {
      if ((arr[i] & 1) == 0) even.push_back(arr[i]); // 偶数
      else odd.push_back(arr[i]); // 奇数
    }

    // 将奇数和偶数拷贝至arr
    arr.clear();
    arr.resize(arr_len);
    copy(odd.begin(), odd.end(), arr.begin());
    copy(even.begin(), even.end(), arr.begin()+odd.size());
  }
};
/*
int main() {
  // 输入
  std::vector<int> vec1 = {3, 4, 5, 1, 1, 2};
  std::vector<int> vec2 = {1,1,2,3,4,6};

  // 调整数组顺序使奇数位于偶数前面
  Solution sol;
  sol.reOrderArray(vec1);
  sol.reOrderArray(vec2);

  // 输出
  for (int i = 0; i < vec1.size(); ++i) {
    printf("%d ",vec1[i]);
    printf("%d\n", vec2[i]);
  }
}*/


2、二维数组中的查找
// 4min10s
class Solution { // O(n*m)
 public:
  bool Find(int target, std::vector<std::vector<int> > arr) {
    // 从右下往左和往下找
    int i = 0, j = arr[0].size()-1;
    while (i < arr.size() && j >= 0) {
      if (arr[i][j] == target) return true;
      else if (arr[i][j] > target) --j;
      else ++i;
    }
    return false;
  }
};
/*
int main() {
  // 输入
  std::vector<std::vector<int> > arr(5, std::vector<int>(3));
  for (int i = 0; i < arr.size(); ++i)
    for (int j = 0; j < arr[0].size(); ++j)
      arr[i][j] = 2*i*j;
  Solution sol;
  // 二维数组中的查找
  int ans = sol.Find(3, arr);
  // 输出
  printf("%d\n", ans);
}*/

3、旋转数组的最小数字

// 6min
class Solution { // O(n)
 public:
  int minNumberInRotateArray(std::vector<int> &arr) {
    // 判断数组是否合格
    if (arr.size() == 0) return 0;
    // 当前一个数大于后一个数时返回后一个数
    for (int i = 0; i < arr.size()-1; ++i)
      if (arr[i] > arr[i+1])
        return arr[i+1];
    return arr[0];
  }
};
/*
int main() {
  // 输入
  std::vector<int> vec1 = {3,4,5,1,1,2};
  std::vector<int> vec2 = {1,1,2,3,4,6};

  Solution sol;
  // 旋转数组的最小数字
  int ans1 = sol.minNumberInRotateArray(vec1);
  int ans2 = sol.minNumberInRotateArray(vec2);

  // 输出
  printf("%d\n", ans1);
  printf("%d\n", ans2);
}*/


字符串

1、替换空格

// 18min
class Solution { // O(n)
 public:
  void replaceSpace(char *str,int length) {
    // 判断字符串和长度合格
    if (str == NULL || length <= 0) return;
 
    // 计算空格数
    int i, space_count = 0;
    for (i = 0; str[i] != '\0'; ++i)
      if (str[i] == ' ')
        ++space_count;
    int new_len = i + 2*space_count;
    if (new_len >= length) return;
    str[new_len] = '\0'; // 注意加结尾符
    // 从后往前将空格替换尾%20
    for (int old_len = i-1; old_len >= 0; --old_len) {
      if (str[old_len] != ' ') str[--new_len] = str[old_len];
      else {
        str[--new_len] = '0';
        str[--new_len] = '2';
        str[--new_len] = '%';
      }
    }
  }
};
/*
int main() {
  // 输入
  char str[20] = "We are happy";
 
  Solution sol;
  // 替换空格
  sol.replaceSpace(str, 20);
 
  // 输出
  printf("%s", str);
}*/


2、字符串的排列

// 40min28s
bool comp(char a, char b) {
  return a<b;
}
class Solution { // O(n+nlgn)
 public:
   std::vector<std::string> Permutation(std::string str) {
     std::vector<std::string> vec;
    // 判断输入合格
    if (str.length() == 0) return vec;
 
    sort(str.begin(), str.end(), comp);
    do { // 也可以使用匿名函数: sort(str.begin(), str.end(), [](cahr a, char b){return a<b;});
      std::string sstr; // 相当于执行了sstr.cler();
      for (int i = 0; i < str.size(); ++i)
        sstr += str[i];
      vec.push_back(sstr);
    } while (next_permutation(str.begin(), str.end()));
    return vec;
  }
};
/*
int main() {
  // 输入
  char str[20] = "abc";
 
  Solution sol;
  // 字符串的按字典序全排列
  std::vector<std::string> ans = sol.Permutation(str);
 
  // 输出
  for (int i = 0; i < ans.size(); ++i)
    printf("%s ", ans[i].c_str());
}*/


其他具体代码与说明


猜你喜欢

转载自blog.csdn.net/u012332571/article/details/53284896