面试过的题目

文章分享了面试中常见的编程题目,涉及字符串移动、控制指令解析、SQL查询语句以及数学函数(如计算字符数量、非0判断、strcpy和矩阵行列式的求解)等技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值