数组
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]);
}
}*/
// 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());
}*/