先上代码截图,代码感觉很笨,回头改进
bool canConstruct(char * ransomNote, char * magazine){
char char1 = ' ';
char* p1 = ransomNote;
while (*p1 != '\0') {
p1++;
}
int ransomSize = p1 - ransomNote;
char* p2 = magazine;
while (*p2 != '\0') {
p2++;
}
int magaSize = p2 - magazine;
char compareArr[1000] = { '0' };
if (ransomSize > magaSize) {
return false;
}
else {
for (int i = 0;i < ransomSize;i++) {
char1 = ransomNote[i];
for (int j = 0;j < magaSize;j++) {
if (char1 == magazine[j]) {
ransomNote[i] = '0';
magazine[j] = '0';
break;
}
}
}
}
for (int i = 0;i <= ransomSize;i++) {
if (i < ransomSize)
compareArr[i] = '0';
else compareArr[i] = '\0';
}
if (!strcmp(ransomNote,compareArr))
return true;
else return false;
}
说一下思路。
首先求出题目给的ransomNote和magazine的长度
char* p1 = ransomNote;
while (*p1 != '\0') {
p1++;
}
int ransomSize = p1 - ransomNote;
char* p2 = magazine;
while (*p2 != '\0') {
p2++;
}
int magaSize = p2 - magazine;
if (ransomSize > magaSize) {
return false;
}
如果ransomNote的长度大于magazine的长度那么直接返回false。
否则的话使用两个for循环去遍历两个字符数组
else {
for (int i = 0;i < ransomSize;i++) {
char1 = ransomNote[i];
for (int j = 0;j < magaSize;j++) {
if (char1 == magazine[j]) {
ransomNote[i] = '0';
magazine[j] = '0';
break;
}
}
}
}
第一个for用来遍历ransomNote,第二个for遍历magazine;
当检测到ransomNote[i] = magazine[j]时,将这两个字符修改为0
我看别人都是用的删除,但我不会,所以改成0=.=
然后定义一个字符数组
char compareArr[1000] = {'0'};
我一开始定义的时27,后面提交错误,力扣最后测试用的字符串是一大堆a,超出了27的长度,我懒得写个不定长度数组了,就直接给了个1000.
然后把compareArr按照ransomNote的长度赋值0.
最后用compareArr字符数组和ransomNote字符数组做比较
若相同则返回true,不同返回false
if (!strcmp(ransomNote,compareArr))
return true;
else return false;
结束。
C语言并不存在字符串,字符串是以字符数组的形式,将每个字符保存在一个数组中,我对这个题中的字符串中单个字符操作的思路主要来自这个原因。
C语言新手,大佬点评别太狠,,,