6. Z 字形变换
char * convert(char * s, int numRows)
{
int len = strlen(s);
if (numRows <= 1)
return s;
char *t = (char *)malloc(sizeof(char) * (len + 1));
int numSize = 0;
int n = 2 * numRows - 2;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < len; j++) {
int k = j % n;
if (k == i || k == n - i) {
t[numSize++] = s[j];
}
}
}
t[numSize] = '\0';
return t;
}
7. 整数反转
int reverse(int x)
{
int num = 0;
while(x) {
// 判断是否溢出
if ((num < INT_MIN / 10 ) || (num > INT_MAX / 10 )) {
return 0;
}
else {
num *= 10;
num += x % 10;
x /= 10;
}
}
return num;
}
8. 字符串转换整数 (atoi)
int myAtoi(char * str)
{
double result = 0;
int flag = 1;
while(*str == ' ') {
str++;
}
if(*str == '-') {
flag = -1;
str++;
}
else if(*str == '+') {
str++;
}
while(*str <= '9' && *str >= '0') {
result = result * 10 + *(str++) - '0';
}
// 判断是否溢出
if ( result > 2147483647 ) {
if(flag == 1) {
return 2147483647;
}
else {
return 2147483648;
}
}
return flag * result;
}
9. 回文数
bool isPalindrome(int x)
{
long long sum = 0;
int temp = x;
if (x < 0) {
return false;
}
while(temp) {
sum = sum * 10 + ( temp % 10 );
temp = temp / 10;
}
if (sum == x) {
return true;
}
else {
return false;
}
}
10. 正则表达式匹配
bool isMatch(char * s, char * p)
{
int sl = strlen(s);
int pl = strlen(p);
bool dp[sl + 1][pl + 1];
memset(dp, 0, sizeof(dp));
for (int i = sl; i > -1; --i) {
for (int j = pl; j > -1; --j) {
if (i == sl && j == pl) {
dp[i][j] = true;
continue;
}
// 第一种是带*的情况
if (pl - j > 1 && p[j + 1] == '*') {
// *可能为零个,所以第一种情况是零的情况,直接判断之前的情况通不通过,是不是真,第二种就是有相同的,符号.或者是两者相同,都可以为true
dp[i][j] = dp[i][j + 2] || (i < sl && (p[j] == '.' || p[j] == s[i]) && dp[i + 1][j]);
}
else {
// 正常情况,符号.或者是两者相同则为真
dp[i][j] = i < sl && (p[j] == '.' || p[j] == s[i]) && dp[i + 1][j + 1];
}
}
}
return dp[0][0]; //最后判断到第一位,如果还是有为真的情况,这证明有一条以上的路是同的
}