-
第一题
基本思路一:只需要遍历字符串二分之一大小,先让第一个字符更新为第一个字符+最后一个字符,最后一个字符等于第一个字符减去最后一个字符,这样就把第一个字符的位置更新为第一个字符,以此内推,第一个字符等于本身减去最后一个字符。
容易报错的情况
(1)heap-buffer-overflow,对地址的非法访问。
(2)AddressSanitizer:DEADLYSIGNAL详细分析与解决,高频越界,数组引用超越了左右边界;无限递归,代码无法正常结束返回;高频函数入参及出参返回处理错误。void reverseString(char* a, int sSize){ int i; for(i=0;i基本思路二:设定头尾指针,当头指针小于尾指针时,不停交换。
void swap(char *left,char *right) { char temp; temp=*left; *left=*right; *right=temp; } void reverseString(char* s, int sSize){ int front=0,rear=sSize-1; while(front -
第二题
基本思路:上一题基本思路二+判断是否为元音。
bool isVowel(char ch) {
char* vowel = "AEIOUaeiou";
int vSize = strlen(vowel);
for (int i = 0;i < vSize;i++) {
if (ch == vowel[i]) {
return true;
}
}
return false;
}
void swap(char* left, char* right) {
char tmp = *left;
*left = *right;
*right = tmp;
}
char * reverseVowels(char * s){
int sSize = strlen(s);
int front = 0, rear = sSize-1;
while (front < rear) {
if (isVowel(s[front]) == false) {
front++;
}
if (isVowel(s[rear]) == false) {
rear--;
}
if (isVowel(s[front]) && isVowel(s[rear])) {
swap(s+front, s+rear);
front++;
rear--;
}
}
return s;
}
- 第三题
基本思路:设定一个标识符,如果magazine中有ransomNote中一样的字符,则加一,每次相等比较后需要改变magazine该位置的字符为非法字符(因为本题要求了字符串是小写字符,所以设定非法字符为该字母的大写状态),最后比较标识符是否等于ransomNote字符串的大小,如果等于说明能找到,否则不能。
bool canConstruct(char * ransomNote, char * magazine){
int i,j;
int l1=strlen(ransomNote); //串一长度
int l2=strlen(magazine); //串二长度
int sum=0; //最后sum为零说明
for(i=0;i
- 第四题
基本思路:
做法一:两个for循环嵌套,这样造成的时间复杂度是O(n^2),在leetcode上通过不了,超过时间复杂度了(隐形条件,leetcode很多都无法通过)。
int firstUniqChar(char * s){
int index=0 ,flag=-1; //返回的索引,如果该值不更新,说明没有找到
int length=strlen(s); //字符串长度
int i,j;
for(i=0;i
}
做法二:
- 第五题
暴力解法。
int numJewelsInStones(char * jewels, char * stones){
int lj=strlen(jewels);
int ls=strlen(stones);
int index=0;
int i,j;
for(i=0;i
- 第六题
基本思路:修改字符串reverse函数,不界定首尾,因为此题需要reverse的字符串的首尾是变动的,然后字符串需要reverse的部分是2k之后,i的递增力度是2k,注意辨别该字符串剩下的字符串个数是否少于k个,如果不足k个需要全部反转,否则只反转前k个。
void swap(char* left,char* right)
{
char temp=*left;
*left=*right;
*right=temp;
}
void reverse(char* front,char* rear){
while(front
- 第七题
基本思路:s不包含任何开头或结尾空格,每个单词之间都会用空格隔开,第一种我们可以原地修改,字符串reverse的方法和前面一致,我们只需要判断空格的位置,来确定单词的起始位置。
void swap(char* a,char* b)
{
char temp;
temp=*a;
*a=*b;
*b=temp;
}
void reverse(char* l ,char *r)
{
while(l 


