记24年3-4月面试过的一些代码题目
1、实现一个函数,函数将一个字符串中的字符’‘移到串的前部分,其他字符后移,但不能改变非’‘字符的先后顺序,函数返回串中字符’'的数量。如原始串为:1*****2567***,处理后为******12567,函数返回值为6。(要求使用尽量少的时间和空间)
int moveStarsToFront(std::string& str) {
int count = 0;
int left = 0;
int right = str.length() - 1;
while (left<right)
{
if (str[left] == '*') {
count++;
left++;
}
else if (str[right] != '*') {
right--;
}
else
{
std::swap(str[left], str[right]);
left++;
right++;
count++;
}
}
return count;
}
int main(int argv, char** args) {
std::string str = "1**2***567*";
int count = moveStarsToFront(str);
std::cout << "处理后的字符串为:" << str << std::endl;
std::cout << "函数返回值为:" << count << std::endl;
return 0;
}
2、现有一个功能需求:程序收到网络发来的一串数据,如果数据中带有控制指令,则需要解析控制指令部分的参数,并调用预定义函数 int user_exec_cmd(chararg1, int arg2)执行指令,对于收到的非控制指令部分的数据,则调用预定义函数int user_uart_send(char data, int data_len) 控制指令格式为:AT+CMD=“arg1_str”,1\r\n
其中 AT+为指令开头,\r\n为指令结束,arg1_str,1分别为字符串型参数arg1和整型参数arg2的值,实际数据中指令可能带不同的参数值。
请编写一个数据处理函数,完成上面的处理需求,函数原型如下:
/// 处理网络数据函数
/// in_buffer: 输入缓冲区,buf_len: 缓冲区长度
/// 返回值,0:成功,非0:不成功
int handle_data_from_net(char in_buffer, int buf_len);
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<memory.h>
#define INCMD "AT+CMD=\"arg1_str\",1\r\n"
int handle_data_from_net(char* in_buffer, int buf_len);
int main(int argv, char** args) {
handle_data_from_net((char*)(INCMD), strlen(INCMD) + 1);
return 0;
}
int handle_data_from_net(char* in_buffer, int buf_len) {
if (0 == strncmp(in_buffer, "AT+", 3)) {
char arg1[127]{ 0 };
int arg2 = 0;
auto p1 = strchr(in_buffer, '\"') + 1;
auto p2 = strchr(p1 + 1, '\"');
memcpy(arg1, p1, p2 - p1);
arg2 = atoi(p2 + 2);
///使用int user_exec_cmd(chararg1, int arg2)替换printf
if (0 < printf("arg1:%s, arg2:%d\n", arg1, arg2))
return 0;
else
return 1;
}
else {
///使用int user_uart_send(char data, int data_len) 替换printf
if (0 < printf("arg1:%s, arg2:%d\n", in_buffer, buf_len))
return 0;
else
return 1;
}
return 2;
}
3、简单sql的面试
1)查询分数在80-90分的学生学号、姓名、分数
SELECT student.学号, student.姓名, grade.分数
FROM student JOIN grade ON student.学号=grade.学号
WHERE grade.分数>79 AND grade.分数<91;
2)在GRADE表中查询学习各门课程的人数
SELECT grade.课程编号, grade.人数 FROM grade;
3)查询所有姓张的学生的学号、姓名
SELECT student.学号, student.姓名
FROM student
WHERE student.姓名
LIKE '张%';
4)查询所有选修课程编号为0002和0003的学生的学号、姓名、性别
SELECT student.学号, student.姓名, student.性别
FROM student
JOIN grade ON student.学号=grade.学号
WHERE grade.课程编号='002' OR grade.课程编号='003';
4、判断float非0方法:
bool isFloatNonZero(float num) {
const float epsilon = 1e-6; // 设置一个很小的阈值作为误差范围
return std::fabs(num) > epsilon;
}
5、写一个strcpy函数
char* strcpy(char* dest, const char* src) {
char* p = dest;
while(*src != ‘\0’) {
*p++ = *src++;
}
*p = ‘\0’;
return dest;
}
6、实现一个函数,接受一个N x N的矩阵并返回其行列式。
const int MAXN = 100;
double a[MAXN][MAXN]; // 矩阵
int n; // 矩阵的阶数
double det() {
double ans = 1.0;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
while (a[j][i] != 0) {
double t = a[i][i] / a[j][i];
for (int k = i; k <= n; k++) {
a[i][k] -= t * a[j][k];
swap(a[i][k], a[j][k]);
}
ans = -ans;
}
}
ans *= a[i][i];
}
return ans;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
double ans = det();
cout << ans << endl;
return 0;
}