编程实例,Time:2023年4月15日
前言
两题编程实例题分为两种提醒,一个字符串处理,一个数组相关。
一、第一题
1.计数二进制子串
一个字符串数组,数据为0和1两个元素,选出里面的有效子串
有效子串条件:
1、数组发生变化
2、两边对称
例如:
输入 110101001101
输出 9
说明:有效子串 10 01 10 01 10 0011 01 10 01 共9个
int getSum(int fast, int num, char* inputStr, int len)
{
int sum = 0;
for(int i = 0; i < num; i++)
{
if(fast + i < len)
{
sum += inputStr[fast + i] - '0';
}
}
return sum;
}
int GetCorrectSubstrNum(char *inputStr)
{
int len = strlen(inputStr);
int count = 0;
for(int i = 0; i < len; i++)
{
int slow = i;
int fast = i + 1;
while(fast < len)
{
if(inputStr[slow] != inputStr[fast])
{
int distance = (fast - slow);
int num = (fast - slow)* (inputStr[slow] - '0');
int sum = getSum(fast, distance, inputStr, len);
if(fast + distance > len)
{
break;
}
if(abs(num - sum) == distance)
{
count++;
}
break;
}
fast++;
}
}
printf("%d",count);
return count;
}
int main()
{
char str[] = "110101001101";
GetCorrectSubstrNum(str);
return 0;
}
AC。
最大圈复杂度 | 6 | |
最大单函数代码行数 | 29 | |
最大代码嵌套深度 | 5 |
二、第二题
1.数组相对排序
存在两个数组,数组arr1长度大于数组arr2的长度,arr2的数字都被包含与arr1,要求将arr1的成员按照arr2的顺序排序,剩下的按大小排序。
输入 arr1[2,8,2,8,4,7] ,arr2[8,2]输出 arr1[8,8,2,2,4,7]
// 注意:返回的数组必须在给定的函数内进行内存分配,由框架代码进行内存释放。返回的数组长度存在 *returnSize 中。
int compare(const void* a, const void* b) //这个地方要写const,不然报错,差点懵逼
{
return *(int*)a - *(int*)b;
}
int *SpecialSort(int *arr1, int arr1Size, int *arr2, int arr2Size, int *returnSize)
{
int* array = (int*)malloc(sizeof(int) * arr1Size);
int index = 0;
for(int i = 0; i < arr2Size; i++)
{
for(int j = 0; j < arr1Size; j++)
{
if(arr2[i] == arr1[j])
{
array[index++] = arr1[j];
arr1[j] = -1;
}
}
}
int* arrayTemp = (int*)malloc(sizeof(int) * (arr1Size - index));
int arrayTempIndex = 0;
for(int i = 0; i < arr1Size; i++)
{
if(arr1[i] != -1)
{
arrayTemp[arrayTempIndex++] = arr1[i];
}
}
qsort(arrayTemp, arrayTempIndex, sizeof(int), compare);
int count = 0;
for(int i = index; i < arr1Size; i++)
{
array[i] = arrayTemp[count++];
}
free(arrayTemp);
*returnSize = arr1Size;
return array;
}
AC
最大圈复杂度 | 7 | |
最大单函数代码行数 | 33 | |
最大代码嵌套深度 | 4 |
三、第三题
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
leetcode题目
打开一个浏览器,此浏览器窗口一般具备浏览历史的特性(如上图所示),请实现如下功能:
BrowserHistorySys(string homepage, int maxCount) — 初始化。homepage作为当前页,并缓存到浏览历史中;浏览历史中最多缓存maxCount个网页。
visit(string url) — 跳转访问页面url,返回访问后浏览历史中的缓存页面数量。
如果入参 url 仍是当前页,则继续浏览此页面,即:当前页不变,且浏览历史也不变;
如果入参 url 不是当前页,则跳转到此 url,并把此 url 页面作为当前页; 同时清除浏览历史中原当前页的前进记录,再将此 url 缓存到浏览历史中。示意如图:
如果新增缓存后,浏览历史缓存页面数量超过 maxCount, 则清除浏览历史中最早的记录。back() — 在浏览历史中从当前页后退一步,返回停留页面的 url,并作为当前页。
注:如果已退无可退,则不再后退,继续停留在当前页。
forward() — 在浏览历史中从当前页前进一步,返回停留页面的 url,并作为当前页。注:如果已进无可进,则不再前进,继续停留在当前页。
// 答题框内的代码仅为待实现代码,执行或提交代码时,仅包含待实现部分,不要包含其它代码。
typedef struct {
char homepage[32];
char (*history)[32];
int maxCount;
int index;
int count;
} BrowserHistorySys;
static BrowserHistorySys *BrowserHistorySysCreate(const char *homepage, int maxCount)
{
BrowserHistorySys* sys = (BrowserHistorySys*)malloc(sizeof(BrowserHistorySys));
sys->maxCount = maxCount;
memcpy(sys->homepage, homepage, strlen(homepage) + 1);
sys->index = 0;
sys->count = 0;
for(int i = 0; i < maxCount; i++)
{
sys->history = (char(*)[32])malloc(sizeof(char) * 32 * maxCount);
}
memcpy(sys->history[0], homepage, strlen(homepage) + 1);
sys->count++;
return sys;
}
static int BrowserHistorySysVisit(BrowserHistorySys *sys, const char *url)
{
if(sys->index + 1 < sys->maxCount && strcmp(sys->homepage, url) != 0)
{
memcpy(sys->homepage, url, strlen(url) + 1);
sys->index++;
memcpy(sys->history[sys->index], url, strlen(url) + 1);
sys->count = sys->index + 1;
}
else if(sys->index + 1 == sys->maxCount)
{
memcpy(sys->homepage, url, strlen(url) + 1);
//reformArray(sys);
memcpy(sys->history[sys->index], url, strlen(url) + 1);
sys->count = sys->maxCount;
}
return sys->count;
}
void reformArray(BrowserHistorySys *sys)
{
for(int i = 0; i < sys->maxCount; i++)
{
memcpy(sys->history[i], sys->history[i+1], strlen(sys->history[i+1]) + 1);
}
}
static char *BrowserHistorySysBack(BrowserHistorySys *sys)
{
printf("index:%d",sys->index);
if(sys->index > 0)
{
printf("index1:%d",sys->index);
sys->index--;
memcpy(sys->homepage, sys->history[sys->index], strlen(sys->history[sys->index]) + 1);
}
return sys->history[sys->index];
}
static char *BrowserHistorySysForward(BrowserHistorySys *sys)
{
if(sys->index + 1 < sys->count)
{
sys->index++;
memcpy(sys->homepage, sys->history[sys->index], strlen(sys->history[sys->index]) + 1);
}
return sys->history[sys->index];
}
static void BrowserHistorySysFree(BrowserHistorySys *sys)
{
free(sys->history);
}
上面的代码有问题,下面这版AC了。赞,之前有问题主要是由于visit里面的逻辑没理清楚。
// 答题框内的代码仅为待实现代码,执行或提交代码时,仅包含待实现部分,不要包含其它代码。
typedef struct {
char homepage[32];
char (*history)[32];
int maxCount;
int index;
int count;
} BrowserHistorySys;
static BrowserHistorySys *BrowserHistorySysCreate(const char *homepage, int maxCount)
{
BrowserHistorySys* sys = (BrowserHistorySys*)malloc(sizeof(BrowserHistorySys));
sys->maxCount = maxCount;
memcpy(sys->homepage, homepage, strlen(homepage) + 1);
sys->index = 0;
sys->count = 0;
for(int i = 0; i < maxCount; i++)
{
sys->history = (char(*)[32])malloc(sizeof(char) * 32 * maxCount);
}
memcpy(sys->history[0], homepage, strlen(homepage) + 1);
sys->count++;
return sys;
}
static int BrowserHistorySysVisit(BrowserHistorySys *sys, const char *url)
{
//入参url仍是当前页,当前页不变,且浏览历史也不变
if(strcmp(sys->homepage, url) == 0)
{
return sys->count;
}
else
{
if(sys->index + 1 < sys->maxCount)
{
memcpy(sys->homepage, url, strlen(url) + 1);
sys->index++;
memcpy(sys->history[sys->index], url, strlen(url) + 1);
sys->count = sys->index + 1;
}
else if(sys->index + 1 == sys->maxCount)
{
memcpy(sys->homepage, url, strlen(url) + 1);
reformArray(sys);
memcpy(sys->history[sys->index], url, strlen(url) + 1);
sys->count = sys->maxCount;
}
}
return sys->count;
}
void reformArray(BrowserHistorySys *sys)
{
for(int i = 0; i < sys->maxCount; i++)
{
memcpy(sys->history[i], sys->history[i+1], strlen(sys->history[i+1]) + 1);
}
}
static char *BrowserHistorySysBack(BrowserHistorySys *sys)
{
if(sys->index > 0)
{
sys->index--;
memcpy(sys->homepage, sys->history[sys->index], strlen(sys->history[sys->index]) + 1);
}
return sys->homepage;
}
static char *BrowserHistorySysForward(BrowserHistorySys *sys)
{
if(sys->index + 1 < sys->count)
{
sys->index++;
memcpy(sys->homepage, sys->history[sys->index], strlen(sys->history[sys->index]) + 1);
}
return sys->homepage;
}
static void BrowserHistorySysFree(BrowserHistorySys *sys)
{
free(sys->history);
}
但是有安全警告,需要重新理一下。下面是经过代码规范处理过得代码。
// 答题框内的代码仅为待实现代码,执行或提交代码时,仅包含待实现部分,不要包含其它代码。
//1、这边存在数组指针怎么申请内存的点
#define STRING_LENGTH 32
typedef struct {
char homepage[STRING_LENGTH];
char (*history)[STRING_LENGTH];
int maxCount;
int index;
int count;
} BrowserHistorySys;
//最大圈复杂度2
static BrowserHistorySys *BrowserHistorySysCreate(const char *homepage, int maxCount)
{
BrowserHistorySys* sys = (BrowserHistorySys*)malloc(sizeof(BrowserHistorySys));
sys->maxCount = maxCount;
//memcpy(sys->homepage, homepage, strlen(homepage) + 1);
memcpy_s(sys->homepage, STRING_LENGTH, homepage, strlen(homepage) + 1);
sys->index = 0;
sys->count = 0;
for(int i = 0; i < maxCount; i++)
{
sys->history = (char(*)[32])malloc(sizeof(char) * 32 * maxCount);
}
//memcpy(sys->history[0], homepage, strlen(homepage) + 1);
memcpy_s(sys->history[0], STRING_LENGTH, homepage, strlen(homepage) + 1);
sys->count++;
return sys;
}
//最大圈复杂度5,最大嵌套深度4
static int BrowserHistorySysVisit(BrowserHistorySys *sys, const char *url)
{
//入参url仍是当前页,当前页不变,且浏览历史也不变
//if(strcmp(sys->homepage, url) == 0)
if(strcmp(sys->homepage, url) == 0) //这边的安全函数不确定
{
return sys->count;
}
else
{
if(sys->index + 1 < sys->maxCount)
{
//memcpy(sys->homepage, url, strlen(url) + 1);
memcpy_s(sys->homepage, STRING_LENGTH, url, strlen(url) + 1);
sys->index++;
memcpy_s(sys->history[sys->index], STRING_LENGTH, url, strlen(url) + 1);
//memcpy(sys->history[sys->index], url, strlen(url) + 1);
sys->count = sys->index + 1;
}
else if(sys->index + 1 == sys->maxCount)
{
memcpy_s(sys->homepage, STRING_LENGTH, url, strlen(url) + 1);
//memcpy(sys->homepage, url, strlen(url) + 1);
reformArray(sys);
memcpy_s(sys->history[sys->index], STRING_LENGTH, url, strlen(url) + 1);
//memcpy(sys->history[sys->index], url, strlen(url) + 1);
sys->count = sys->maxCount;
}
}
return sys->count;
}
void reformArray(BrowserHistorySys *sys)
{
for(int i = 0; i < sys->maxCount; i++)
{
memcpy_s(sys->history[i], STRING_LENGTH, sys->history[i+1], strlen(sys->history[i+1]) + 1);
//memcpy(sys->history[i], sys->history[i+1], strlen(sys->history[i+1]) + 1);
}
}
static char *BrowserHistorySysBack(BrowserHistorySys *sys)
{
if(sys->index > 0)
{
sys->index--;
memcpy_s(sys->homepage, STRING_LENGTH, sys->history[sys->index], strlen(sys->history[sys->index]) + 1);
//memcpy(sys->homepage, sys->history[sys->index], strlen(sys->history[sys->index]) + 1);
}
return sys->homepage;
}
static char *BrowserHistorySysForward(BrowserHistorySys *sys)
{
if(sys->index + 1 < sys->count)
{
sys->index++;
memcpy_s(sys->homepage, STRING_LENGTH, sys->history[sys->index], strlen(sys->history[sys->index]) + 1);
//memcpy(sys->homepage, sys->history[sys->index], strlen(sys->history[sys->index]) + 1);
}
return sys->homepage;
}
static void BrowserHistorySysFree(BrowserHistorySys *sys)
{
free(sys->history);
}
//补充,这里也可可以用strcpy函数,对应的安全函数是strncpy。
3.1代码规范
合格 | 备注 | ||
代码行数 | 77 | 无限制 | |
单函数代码最大行数 | 25 | 50 | |
最大代码长度 | 104 | 120 | |
最大代码圈复杂度 | 5 | 1-10 | |
最大代码嵌套深度 | 3 | 4 | 那这个最大嵌套深度应该是花括号嵌套深度了 |
函数的参数最大个数 | 2 | 5 |
安全函数:源码libboundscheck: 华为C语言安全函数库:https://gitee.com/openeuler/libboundscheck - Gitee.com
原函数 | 安全函数 | 函数原型(错误) | 函数原型(正确) |
memcpy | memcpy_s | memcpy(const void* dest, int destLen, const void* src, srcLen) | memcpy_s(void* dest, size_t destMax, const void* src, size_t count) |
strcpy | strcpy_s | strcpy(const void* dest, int destLen, const void* src, srcLen) | strcpy_s(char* strDest, size_t destMax, const char* strSrc); |
strcmp | 无 | strcpy(const void* dest, const void* src) | |
strncpy | strncpy_s | strncpy_s(char* strDest, size_t destMax, const char* strSrc, size_t count); |
3.2strcpy和strncpy区别?
strcpy()
strcpy()用来复制字符串
其原型为char* strcpy(char * destn, const char * src );
dest 为目标字符串指针,src 为源字符串指针。
strcpy() 把src所指的由NULL结束的字符串复制到dest 所指的数组中,返回指向 dest 字符串的起始地址。
源字符串必须以 ‘\0’ 结束。
目标空间必须足够大,以确保能存放源字符串。
仅用于复制字符串,不仅会复制字符串的内容,还会将源字符串中的 ‘\0’ 拷贝到目标空间。
strncpy
strncpy()用来复制字符串的前n个字符
其原型为char * strncpy ( char * dest, const char * src, size_t num );
dest 为目标字符串指针,src 为源字符串指针,num为拷贝的字读数。
strncpy()会将字符串src前n个字符拷贝到字符串dest。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
一旦遇到0以后,后面被拷贝的字节就全部是 0
仅用于复制字符串,并且是指定的前n个字符,但不会追加结束符’\0’
memcpy
memcpy()提供了一般内存的复制,对于需要复制的内容没有限制
其原型为void * memcpy ( void * dest, const void * src, size_t num );
dest 为目标指针,src 为源指针。num为字节数。
memcpy()会将src前n个字节拷贝到dest中。
可以复制任意内容,不仅限于字符串,同时也需要指定复制长度。
总结
strcpy只能复制字符串,并且是整个字符串
strncpt只能复制字符串,但可以指定个数
memcpy可以复制任意类型的数据,并且可以指定个数
strcpy遇到被复制字符的串结束符"\0"才结束,所以容易溢出。
strncpy,memcpy则是根据其第3个参数决定复制的长度。
strncpy一旦遇到0以后,后面被拷贝的字节就全部是 0。
memcpy 是不关注被拷贝的内容是什么的。
复制字符串时用strcpy,strncpy,而需要复制其他类型数据时则一般用memcpy。
3.3 这里的代码还有一个需要注意的就是数组指针的内存申请
我这边的方法是
sys->history = (char(*)[32])malloc(sizeof(char) * 32 * maxCount);
这边两个点,一个是类型强制转换方式,另一个其实是申请了一个一维数组。
那么可不可以直接按照数组指针来申请呢,百度一下。
增加其他的bject题目
四、第四题
/*
题目描述
现有一批杂乱的字符串,请逐个判断每个字符串是否是合法的工号,把非法的直接丢弃,并将合法的整理成规定的格式。合法工号:去除所有空格后,长度不超过9;首位为字母、其它均为数字(至少有一个数字)。
格式化要求:
工号首字母统一规整成小写字符。
去除所有空格。
如果工号不满9位,在数字前面补零,使工号长度恰好为9。
请对格式化后的合法工号,去重后,按照字典序升序输出。解答要求
时间限制:1000ms, 内存限制:256MB
输入
一个整数 N ,表示待整理工号的个数,取值范围:[1, 100)
接下来 N 行,每行字符串是一个待整理的工号(长度不超过20)输出
按照升序排序的规整后的合法工号。
*/
/*
* Description:
* Note: 缺省代码仅供参考,可自行决定使用、修改或删除
*/
#include "securec.h"
#include "stdbool.h"
#include "ctype.h"
#define MAXN 100
#define BUF_LEN 32
bool isValidString(char *strs)
{
int len = strlen(strs);
int wordCount = 0;
int stringLen = 0;
for(int i = 0; i < len; i++)
{
if(strs[i] == ' ' )
{
continue;
}
if(isalpha(strs[i]))
{
wordCount++;
}
stringLen++;
}
if(wordCount == 1 && stringLen <= 9 && stringLen > 1)
{
return true;
}
return false;
}
char* getcorrectString(char *strs)
{
int len = strlen(strs);
char *str = (char*)malloc(sizeof(char) * 32);
memset(str, '0', sizeof(char) * 32);
int count = 9;
for(int i = len - 1; i >= 0; i--)
{
if(isalpha(strs[i]))
{
str[0] = strs[i];
}
if(strs[i] >= '0' && strs[i] <= '9')
{
str[--count] = strs[i];
}
}
str[9] = '\0';
str[9] = '\n';
//str[10] = '\n';
return str;
}
int comp(const void* a, const void* b)
{
//printf("%s\n", (unsigned int*)(*(int*)a));
int diff = 0;
//diff = strcmp( (char*) ((unsigned int*)(*(int*)a)), (char*)( (unsigned int*)(*(int*)b)) );
return diff;
}
/* 按题目要求输出到 outBuf/outBufLen 中,换行使用 '\n' */
void RecularId(char **strs, int strCnt, char *outBuf, int outBufLen)
{
char outBufTest[MAXN * BUF_LEN];
char (*p)[32] = (char(*)[32])outBufTest;
int index = 0;
//qsort(strs, strCnt, sizeof(char), comp); //这边不能这么传参,二级指针不是数组
for(int i = 0; i < strCnt; i++)
{
for(int j = 0; j < strlen(strs[i]); j++)
{
strs[i][j] = tolower(strs[i][j]);
}
}
for(int i = 0; i < strCnt; i++)
{
for(int j = i + 1; j < strCnt; j++)
{
if(strcmp(strs[i], strs[j]) > 0)
{
char temp[BUF_LEN];
strcpy_s(temp, BUF_LEN, strs[i]);
strcpy_s(strs[i], BUF_LEN, strs[j]);
strcpy_s(strs[j], BUF_LEN, temp);
}
else if(strcmp(strs[i], strs[j]) == 0)
{
printf("equal");
memset(strs[i], '0', sizeof(char) * BUF_LEN);
}
}
}
for(int i = 0; i < strCnt; i++)
{
printf("test:%s\n", strs[i]);
}
// 在此添加你的代码
for(int i = 0; i < strCnt; i++)
{
if(!isValidString(strs[i]))
{
continue;
}
char *newStr = getcorrectString(strs[i]);
//strcpy_s(*(p+i), 32, newStr);
memcpy_s(&outBuf[index * 10], 10, newStr, 10); //这边不能用strcpy和strncpy
index++;
free(newStr);
}
}
/* 代码仅供参考,注意避免圈复杂度过大 */
int main(void)
{
int n;
if (scanf_s("%d\n", &n) != 1) { return -1; }
static char buf[MAXN][BUF_LEN];
static char *input[MAXN];
int i;
for (i = 0; i < n; i++) {
if (NULL == gets_s(buf[i], sizeof(buf[i]))) { return -1; }
input[i] = buf[i];
}
static char outBuf[MAXN * BUF_LEN];
RecularId(input, n, outBuf, sizeof(outBuf));
(void)printf("%s", outBuf);
return 0;
}
6
s00123
k23490
s 234
x2 3 5
m 9 9 0
d 8 9 0
上述的代码对于这个用例通过不了,还需要修改
2023年11月21日20:23:16
经过多次修改终于aced
#include "securec.h"
#include "stdbool.h"
#include "ctype.h"
#define MAXN 100
#define BUF_LEN 32
char** getValidStr(char **strs, int strCnt )
{
for(int i = 0; i < strCnt; i++)
{
int wordCount = 0;
if(strs[i][0] < 'a' || strs[i][0] > 'z')
{
memset_s(strs[i], strlen(strs[i]), '\0', strs[i]);
}
for(int j = 0; j < strlen(strs[i]); j++)
{
if(strs[i][j] >= 'a' && strs[i][j] <= 'z')
{
wordCount++;
}
}
if(wordCount > 1)
{
memset_s(strs[i], strlen(strs[i]), '0', strs[i]);
}
if(strlen(strs[i]) > 9)
{
memset_s(strs[i], strlen(strs[i]), '0', strs[i]);
}
}
return strs;
}
char* getcorrectString(char *strs)
{
int len = strlen(strs);
char *str = (char*)malloc(sizeof(char) * 32);
memset(str, '0', sizeof(char) * 32);
int count = 9;
for(int i = len - 1; i >= 0; i--)
{
if(isalpha(strs[i]))
{
str[i] = strs[i];
}
if(strs[i] >= '0' && strs[i] <= '9')
{
str[--count] = strs[i];
}
}
str[9] = '\0';
return str;
}
void reformString(char **strs, int strCnt)
{
for(int i = 0; i < strCnt; i++)
{
int index = 0;
char temp[32] = {'\0'};
for(int j = 0; j < strlen(strs[i]); j++)
{
if(strs[i][j] == ' ')
{
continue;
}
if( !isalpha(strs[i][j]) && !isdigit(strs[i][j]) )
{
memset_s(strs[i], BUF_LEN, '0', BUF_LEN);
continue;
}
if(isalpha(strs[i][j]))
{
strs[i][j] = tolower(strs[i][j]);
}
temp[index++] = strs[i][j];
}
temp[index] = '\0';
strcpy_s(strs[i], BUF_LEN, temp);
}
}
/* 按题目要求输出到 outBuf/outBufLen 中,换行使用 '\n' */
void RecularId(char **strs, int strCnt, char *outBuf, int outBufLen)
{
char outBufTest[MAXN * BUF_LEN];
char (*p)[32] = (char(*)[32])outBufTest;
reformString(strs, strCnt);
char** validStr = getValidStr(strs, strCnt);
char *newStr[100];
for(int i = 0; i < strCnt; i++)
{
newStr[i] = getcorrectString(validStr[i]);
}
for(int i = 0; i < strCnt; i++)
{
for(int j = i + 1; j < strCnt; j++)
{
if(strcmp(newStr[i], newStr[j]) == 0)
{
memset(newStr[j], '0', sizeof(char) * BUF_LEN);
}
}
}
for(int i = 0; i < strCnt; i++)
{
for(int j = i + 1; j < strCnt; j++)
{
if(strcmp(newStr[i], newStr[j]) > 0)
{
char temp[BUF_LEN];
strcpy_s(temp, BUF_LEN, newStr[i]);
strcpy_s(newStr[i], BUF_LEN, newStr[j]);
strcpy_s(newStr[j], BUF_LEN, temp);
}
}
}
int index = 0;
for(int i = 0; i < strCnt; i++)
{
if(newStr[i][0] >= 'a' && newStr[i][0] <= 'z')
{
newStr[i][9] = '\n'; //这边不需要'\0'了,有'\n'就可以了
memcpy_s(outBuf + index * 10, outBufLen, newStr[i], 10);
index++;
}
}
}
/* 代码仅供参考,注意避免圈复杂度过大 */
int main(void)
{
int n;
if (scanf_s("%d\n", &n) != 1) { return -1; }
static char buf[MAXN][BUF_LEN];
static char *input[MAXN];
int i;
for (i = 0; i < n; i++) {
if (NULL == gets_s(buf[i], sizeof(buf[i]))) { return -1; }
input[i] = buf[i];
}
static char outBuf[MAXN * BUF_LEN];
RecularId(input, n, outBuf, sizeof(outBuf));
(void)printf("%s", outBuf);
return 0;
}
存在扣分项,
最大圈复杂度 | 扣5 |
安全函数 | 扣8 |
更改了2个memset,将一段代码封装进函数,成功解决代码规范扣分,代码规范代码如下
#include "securec.h"
#include "stdbool.h"
#include "ctype.h"
#define MAXN 100
#define BUF_LEN 32
char** getValidStr(char **strs, int strCnt )
{
for(int i = 0; i < strCnt; i++)
{
int wordCount = 0;
if(strs[i][0] < 'a' || strs[i][0] > 'z')
{
memset_s(strs[i], strlen(strs[i]), '\0', strs[i]);
}
for(int j = 0; j < strlen(strs[i]); j++)
{
if(strs[i][j] >= 'a' && strs[i][j] <= 'z')
{
wordCount++;
}
}
if(wordCount > 1)
{
memset_s(strs[i], strlen(strs[i]), '0', strs[i]);
}
if(strlen(strs[i]) > 9)
{
memset_s(strs[i], strlen(strs[i]), '0', strs[i]);
}
}
return strs;
}
char* getcorrectString(char *strs)
{
int len = strlen(strs);
char *str = (char*)malloc(sizeof(char) * BUF_LEN);
memset_s(str, BUF_LEN, '0', sizeof(char) * BUF_LEN);
int count = 9;
for(int i = len - 1; i >= 0; i--)
{
if(isalpha(strs[i]))
{
str[i] = strs[i];
}
if(strs[i] >= '0' && strs[i] <= '9')
{
str[--count] = strs[i];
}
}
str[9] = '\0';
return str;
}
void reformString(char **strs, int strCnt)
{
for(int i = 0; i < strCnt; i++)
{
int index = 0;
char temp[BUF_LEN] = {'\0'};
for(int j = 0; j < strlen(strs[i]); j++)
{
if(strs[i][j] == ' ')
{
continue;
}
if( !isalpha(strs[i][j]) && !isdigit(strs[i][j]) )
{
memset_s(strs[i], BUF_LEN, '0', BUF_LEN);
continue;
}
if(isalpha(strs[i][j]))
{
strs[i][j] = tolower(strs[i][j]);
}
temp[index++] = strs[i][j];
}
temp[index] = '\0';
strcpy_s(strs[i], BUF_LEN, temp);
}
}
char **sortStrFunc(char **newStr, int strCnt)
{
for(int i = 0; i < strCnt; i++)
{
for(int j = i + 1; j < strCnt; j++)
{
if(strcmp(newStr[i], newStr[j]) == 0)
{
memset_s(newStr[j], BUF_LEN, '0', sizeof(char) * BUF_LEN);
}
}
}
for(int i = 0; i < strCnt; i++)
{
for(int j = i + 1; j < strCnt; j++)
{
if(strcmp(newStr[i], newStr[j]) > 0)
{
char temp[BUF_LEN];
strcpy_s(temp, BUF_LEN, newStr[i]);
strcpy_s(newStr[i], BUF_LEN, newStr[j]);
strcpy_s(newStr[j], BUF_LEN, temp);
}
}
}
return newStr;
}
/* 按题目要求输出到 outBuf/outBufLen 中,换行使用 '\n' */
void RecularId(char **strs, int strCnt, char *outBuf, int outBufLen)
{
reformString(strs, strCnt);
char** validStr = getValidStr(strs, strCnt);
char *newStr[MAXN];
for(int i = 0; i < strCnt; i++)
{
newStr[i] = getcorrectString(validStr[i]);
}
char** sortStr = sortStrFunc(newStr, strCnt);
int index = 0;
for(int i = 0; i < strCnt; i++)
{
if(sortStr[i][0] >= 'a' && sortStr[i][0] <= 'z')
{
sortStr[i][9] = '\n'; //这边不需要'\0'了,有'\n'就可以了
memcpy_s(outBuf + index * 10, outBufLen, sortStr[i], 10);
index++;
}
}
}
/* 代码仅供参考,注意避免圈复杂度过大 */
int main(void)
{
int n;
if (scanf_s("%d\n", &n) != 1) { return -1; }
static char buf[MAXN][BUF_LEN];
static char *input[MAXN];
int i;
for (i = 0; i < n; i++) {
if (NULL == gets_s(buf[i], sizeof(buf[i]))) { return -1; }
input[i] = buf[i];
}
static char outBuf[MAXN * BUF_LEN];
RecularId(input, n, outBuf, sizeof(outBuf));
(void)printf("%s", outBuf);
return 0;
}
五、矩阵倒置
//矩阵转置
//题目描述
//一个正方矩阵是长宽等长,由单个十进制数字字符构成的矩阵。 比如,这是一个 3 x 3 的正方矩阵:
//该正方矩阵有两种表达:
//
//行优先表达:即先从左到右,再从上到下罗列所有元素;上述正方矩阵描述为235743819
//列优先表达:即先从上到下,再从左到右罗列所有元素;上述正方矩阵描述为278341539
//给定正方矩阵的行优先表达,请输出对应的列优先表达;如果输入不能表达为一个正方矩阵,即长度不满足整数平方数时,对应输出字符串 ERROR。
#include "securec.h"
#define BUF_LEN 10005
// 待实现函数,在此函数中填入答题代码
void Transpose(const char* input, char* outBuf, int outBufLen)
{
int len = strlen(input);
int value = sqrt(len);
if(pow(value, 2) != len)
{
strcpy_s(outBuf, outBufLen, "ERROR");
return;
}
//way 1
int count = 0;
char array[value][value];
for(int i = 0; i < value; i++)
{
for(int j = 0; j < value; j++)
{
array[i][j] = input[count++];
}
}
count = 0;
for(int i = 0; i < value; i++)
{
for(int j = 0; j < value; j++)
{
outBuf[count++] = array[j][i];
}
}
//way 2
count = 0;
char (*p)[value] = (char(*)[value])input;
for(int j = 0; j < value; j++)
{
for(int i = 0; i < value; i++)
{
outBuf[count++] = *((*(p + i)) + j);
}
}
}
// 代码仅供参考,注意避免圈复杂度过大
int main(void)
{
static char buf[BUF_LEN];
if (gets_s(buf, sizeof(buf)) == NULL) { return -1; }
static char outBuf[BUF_LEN];
Transpose(buf, outBuf, sizeof(outBuf));
(void)printf("%s", outBuf);
return 0;
}
//这个题目需要注意的点有:
//sqrt开平方根
//pow平方
总结
注意细节。