【笔试】02

TCP

TCP(传输控制协议)是一种面向连接的可靠的基于字节流的传输层通信协议

它能够提供以下服务:

  • 可靠传输
    通过序列号、确认应答、重传机制等确保数据完整、准确地从发送端传输到接收端。
    三次握手:
    在这里插入图片描述
  • 点对点
  • 全双工
  • 面向字节流
  • 流量控制:通过滑动窗口机制,接收端可以控制发送端的发送速率,防止接收端来不及处理导致数据丢失。
  • 拥塞控制:当网络出现拥堵时,TCP能够减少其数据传输速率,避免造成更严重的网络拥塞。
  • 数据顺序控制:保证数据按照发送顺序到达接收端。
  • 对比:

在这里插入图片描述

不能提供的服务:

  • 时延和带宽保证
  • 多播和广播:TCP是基于点对点的通信模式,不支持多播(一点对多点)和广播(一点对全点)通信。

HTTP

  • 使用TCP传输
    TCP是一个传输协议,而HTTP全称是超文本传输协议,是在传输时使用TCP协议,HTTP是在应用层进行握手,即服务器上的运行的进程之间的通信
  • HTTP不保留状态,或者说无状态stateless
  • 消息格式
    • 发送:方法(GET POST)+URL+协议
    • 相应:协议+状态码+状态词
  • 响应状态码:
    • 404 Not Found: 表示客户端能够与服务器通信,但服务器找不到请求的资源。
    • 200 OK:请求成功,服务器提供了请求的网页
    • 5XX - 服务器错误

字符数组初始化方法

  • 直接赋值
    编译器会自动计算数组str的大小,包括字符串的结尾标识符\0。
char str[] = "Hello, World!";
  • 指定大小赋值
    数组的大小必须足够大,以存储所有字符和末尾的\0。
char str[14] = "Hello, World!";
  • 逐字符填充
    逐字符初始化时,必须包括字符串的结束符\0。
    如果你指定的大小大于实际初始化的字符数(包括必需的终止符\0),剩余的部分将自动用\0填充。
char str[] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'};
  • 二维数组也要注意/0
char str[4][6] = {"hello", "world"};

unsigned int 范围

int 在大多数系统上占用 4 个字节(32 位),其取值范围是从 -2147483648 到 2147483647
unsigned int 在大多数系统上占用 4 个字节(32 位),其取值范围为 0 到 4294967295。

冒泡排序

冒泡排序的基本思想是,重复地遍历待排序序列,每次比较相邻的两个元素,如果它们的顺序错误,则交换它们。通过每次遍历,将最大的元素“冒泡”到最后

def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr

选择排序

选择排序的基本思想是,每次从待排序的元素中选择最小的元素,放置到已排序序列的末尾。

def selection_sort(arr):n = len(arr)for i in range(n):min_index = ifor j in range(i+1, n):if arr[j] < arr[min_index]:min_index = jarr[i], arr[min_index] = arr[min_index], arr[i]return arr

补码

补码是一种用于表示有符号整数的编码方式,常用于计算机系统中。在补码表示法中,正整数的二进制表示与无符号整数相同,而负整数的表示稍有不同。

具体来说,对于一个 n 位的补码表示:

对于正整数,其补码与其原码(即二进制表示)相同。
对于负整数,先将其绝对值表示成二进制形式,然后取反(每一位取反),最后加 1

在一个字节(8bit)的补码中,负数的表示范围是 -128 到 -1,而正数的表示范围是 0 到 127。

参数传递和内存分配

分析运行下面的Test函数会有什么样的结果,为什么?

void GetMemory1(char*p)
{
p = (char*)malloc(100);
}
void Testl(void)
{
char*str =NULL;
GetMemory1(str);
strcpy(str,"hello world");
printf(str);
}

GetMemory() 函数中的指针 p 是按值传递的,而不是按引用传递。在 GetMemory() 函数内部分配了内存,并将其地址存储在 p 中,但这个地址只是 GetMemory() 函数内部的局部变量,它并不会改变 Test() 函数中指针 str 的值。因此,Test() 函数中的 str 指针仍然是 NULL,没有指向任何有效的内存位置。
未定义行为导致程序崩溃,因为试图写入未分配的内存地址。

char *GetMemory2(void)
{
char p[] = "helloworld";
return p;
}
void Test2(void)
{
char *str =NULL;
str= GetMemory2();
printf(str);
}

输出乱码。

GetMemory() 函数中的局部数组 p 是在栈上分配的,它的生命周期仅限于 GetMemory() 函数的执行过程。当 GetMemory() 函数返回时,p 的内存将被释放,但 Test() 函数中的 str 指针仍然指向已释放的内存地址,这会导致未定义行为,可能会输出垃圾值,程序崩溃或其他意外行为。

void GetMemory(char** p, int num)
{*p = (char*)malloc(num);
}
void Test(void)
{char* str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);
}

正确打印了hello。利用二级指针做函数形参,成功把str变成分配的大小为100字节连续空间的的起始地址。但是没有用free进行内存释放,造成内存泄漏。

void Test(void)
{char* str = (char*)malloc(100);strcpy(str, "hello");free(str);if (str != NULL){strcpy(str, "world");printf(str);}
}

虽然调用了 free(str) 释放了内存,但并没有将 str 指针置为 NULL。因此,在 if (str != NULL) 中,虽然 str 已经指向了一片已经释放的内存,但由于 str 本身并不是 NULL,所以条件成立,进入了 if 分支。所以正常进行strcpy(str, “world”);,最后打印world。对已经释放的内存进行操作,也可能导致未定义行为。

函数的继承派生、虚函数

这段代码的输出结果是什么

class Ca
{
public:Ca() {strcpy(m_info,"fa");printf("Ca”);}virtual void f() {printf(m info);}void f1(){printf("fa1”);}void f2(int i=3){ this->f();printf("%d”,i);}char m info[10];
};
class Cb:public Ca
{
public:Cb (){printf("cb”);}void f(){printf("fb”);}void f1(){printf("fb1”);}void f2(int i=5){ this->f();printf("%d”,i);}
};
int main()
{Ca* p=NULL;Ca a;Cb b;p = &a;p->f();p->f1();p->f2();p = &b;p->f();p->f1();p->f2();
}

**通过基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。**为了消除这种尴尬,让基类指针能够访问派生类的成员函数,C++ 增加了虚函数(Virtual Function)。有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。换句话说,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)。

Ca
Ca
Cb
fa
fa1
fa3
fb
fa1
fb3

模拟题

两个字符串 start 和 target,长度均为n。每个字符串 仅 由字符’L’、‘R’ 和’_‘组成,其中:字符"L’ 和’R’ 表示片段,其中片段"L’只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段’R’ 只有在其右侧直接存在一个 空位 时才能向 右 移动。字符’'表示可以被 任意 ‘L’或’R’ 片段占据的空位。如果在移动字符串 start 中的片段任意次之后可以得到字符串 target ,返回 true ;否则,返回 false 。
示例 1:
输入:start=“L___R___R”,target="L______RR"输出:true

示例 2:
输入:start=“R_L _”,target=" __LR"
输出:false解释:字符串 start 中的’R’ 片段可以向右移动一步得到"RL"但是,在这一步之后,不存在可以移动的片段,所以无法从字符串 start 得到 target 。
示例 3:输入:start="R",target="R"输出:false解释:字符串 start 中的片段只能向右移动,所以无法从字符串 start 得到 target 。
实现函数
bool canChange(char* start, char* target),并说明思路

class Solution {
public:bool canChange(string start, string target) {if(start.size()!=target.size())return false;vector<pair<char,int>>s,t;for(int i=0;i<start.size();i++){if(start[i]!='_'){s.push_back(make_pair(start[i],i));}if(target[i]!='_'){t.push_back(make_pair(target[i],i));}}if(s.size()!=t.size())return false;for(int i=0;i<s.size();i++){if(s[i].first=='L' && s[i].second<t[i].second)return false;else if(s[i].first=='R' && s[i].second>t[i].second)return false;else if(s[i].first!=t[i].first)return false;}return true;}
};

将start和target数组里面的非’_'元素全存到vector<pair<char,int>>容器中,然后比较这两个容器,如果相同位置内容不同,则返回false;如果start代表的容器的’L’的下标位置小于target的位置,由于L不能右移,故返回false;同理start的R的位置大于target的R的位置则返回false;其他情况都是返回true。

链表题

leetcode 24 两两交换链表中的节点
https://leetcode.cn/problems/swap-nodes-in-pairs/description/?envType=study-plan-v2&envId=top-100-liked

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* dummy=new ListNode(0);dummy->next=head;ListNode* cur=dummy;ListNode* pre=dummy;while(cur->next!=NULL && cur->next->next!=NULL){pre=cur;cur=cur->next;ListNode* tmp=cur->next;cur->next=cur->next->next;tmp->next=cur;pre->next=tmp;   }ListNode* res=dummy->next;delete dummy;return res;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304436.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机毕业设计】校园网书店系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

JDK版本升级后连不上MySQL数据库的问题

1. 问题描述 用户在将 JDK 版本从 8 升级到 11 后&#xff0c;发现应用无法连接到 MySQL 数据库&#xff0c;出现连接超时或连接被拒绝的错误。 例如出现如下报错信息&#xff1a; 可能原因&#xff1a; JDBC驱动版本不兼容&#xff1a; 新的 JDK 11 可能需要使用更高版本的 My…

Flutter第六弹 基础列表ListView

目标&#xff1a; 1&#xff09;Flutter有哪些常用的列表组建 2&#xff09;怎么定制列表项Item&#xff1f; 一、ListView简介 使用标准的 ListView 构造方法非常适合只有少量数据的列表。我们还将使用内置的 ListTile widget 来给我们的条目提供可视化结构。ListView支持…

Canal介绍原理及安装

Canal 扩展篇 1.Canal介绍、 链接: https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费&#xff0c;工作原理如下&#xff1a; Canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &am…

Redis中的集群(五)

集群 在集群中执行命令 MOVED错误。 当节点发现键所在的槽并非由自己负责处理的时候&#xff0c;节点就会向客户端返回一个MOVED错误&#xff0c;指引客户端转向至正在负责槽的节点&#xff0c;MOVED错误的格式为: MOVED <slot> <ip>:<port>其中slot为键…

深度解读C++17中的std::string_view:解锁字符串处理的新境界

深入研究C17中的std::string_view&#xff1a;解锁字符串处理的新境界 一、简介二、std::string_view的基础知识2.1、构造函数2.2、成员函数 三、std::string_view为什么性能高&#xff1f;四、std::string_view的使用陷阱五、std::string_view源码解析六、总结 一、简介 C中有…

【开源社区】openEuler、openGauss、openHiTLS、MindSpore

【开源社区】openEuler、openGauss、openHiTLS、MindSpore 写在最前面开源社区参与和贡献的一般方式开源技术的需求和贡献方向 openEuler 社区&#xff1a;开源系统官方网站官方介绍贡献攻略开源技术需求 openGauss 社区&#xff1a;开源数据库官方网站官方介绍贡献攻略开源技术…

数字乡村:科技引领新时代农村发展

随着信息技术的迅猛发展和数字化浪潮的推进&#xff0c;数字乡村作为新时代农村发展的重要战略&#xff0c;正日益成为引领农村现代化的强大引擎。数字乡村不仅代表着农村信息化建设的新高度&#xff0c;更是农村经济社会发展的重要支撑。通过数字技术的深入应用&#xff0c;农…

vue2创建项目的两种方式,配置路由vue-router,引入element-ui

提示&#xff1a;vue2依赖node版本8.0以上 文章目录 前言一、创建项目基于vue-cli二、创建项目基于vue/cli三、对吧两种创建方式四、安装Element ui并引入五、配置路由跳转四、效果五、参考文档总结 前言 使用vue/cli脚手架vue create创建 使用vue-cli脚手架vue init webpack创…

✌2024/4/6—力扣—最长公共前缀✌

代码实现&#xff1a; char *longestCommonPrefix(char **strs, int strsSize) {if (strsSize 0) {return "";}for (int i 0; i < strlen(strs[0]); i) { // 列for (int j 1; j < strsSize; j) { // 行if (strs[0][i] ! strs[j][i]) { // 如果比较字符串的第…

Java特性之设计模式【外观模式】

一、外观模式 概述 外观模式&#xff08;Facade Pattern&#xff09;隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式&#xff0c;它向现有的系统添加一个接口&#xff0c;来隐藏系统的复杂性 这种模式涉及到一…

uniapp中页面滚动锚点位置及滚动到对应高度显示对应按钮

可以把页面代码和组件代码放自己项目里跑一下 页面代码 <template><view class"Tracing-detail"><view class"title" v-for"i in 30">顶部信息</view><!-- tab按钮 --><Tab v-model"activeIndex" …

云手机解决海外社媒运营的诸多挑战

随着海外社交媒体运营的兴起&#xff0c;如何有效管理多个账户成为了一项挑战。云手机作为一种新兴的解决方案&#xff0c;为海外社媒运营带来了前所未有的便利。 云手机的基本原理是基于云计算和虚拟化技术&#xff0c;允许用户在物理手机之外创建和使用多个虚拟手机。这种创新…

Node.js 的 5 个常见服务器漏洞

Node.js 是一个强大且广泛使用的 JavaScript 运行时环境&#xff0c;用于构建服务器端应用程序。然而&#xff0c;与任何其他软件一样&#xff0c;Node.js 也有自己的一些漏洞&#xff0c;如果处理不当&#xff0c;可能会导致安全问题。请注意&#xff0c;这些漏洞并不是 Node.…

嵌入式面向对象学习 RT-Thread I/O 设备管理框架 设备驱动层 案例测试

嵌入式面向对象 RT-Thread I/O 设备管理框架 设备驱动层 注&#xff1a;本文介绍性内容转载于《RT-Thread记录&#xff08;十、全面认识 RT-Thread I/O 设备模型&#xff09;》 注&#xff1a; 本次使用的开发板 &#xff1a; ​ 兆易创新GD32F407VET6开发板 ​ 雅特力科技…

nginx配置证书和私钥进行SSL通信验证

文章目录 一、背景1.1 秘钥和证书是两个东西吗&#xff1f;1.2 介绍下nginx配置文件中参数ssl_certificate和ssl_certificate_key1.3介绍下nginx支持的证书类型1.4 目前nginx支持哪种证书格式&#xff1f;1.5 nginx修改配置文件目前方式也会有所不同1.6 介绍下不通格式的证书哪…

微服务-4 Nacos

目录 一、注册中心 二、配置管理 1. 添加配置 2. 配置自动刷新 3. 多环境配置共享​编辑 一、注册中心 服务列表&#xff1a; 服务详情&#xff1a; 二、配置管理 1. 添加配置 (1). 在 nacos 界面中添加配置文件&#xff1a; 配置列表&#xff1a; 配置详情&#xff1a;…

Qt之QSS样式表

QSS简介 QSS&#xff08;Qt Style Sheet&#xff09;样式表是一种用于描述图形用户界面&#xff08;GUI&#xff09;样式的语言。它允许开发者为应用程序的控件定义视觉外观&#xff0c;例如颜色、字体、尺寸和布局等。 QSS 样式表的主要目的是提供一种简洁而灵活的方式来美化…

【优选算法专栏】专题四:前缀和(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

DRF 常用功能

文章目录 一、主流认证方式Session认证Token认证JWT认证 二、DRF认证与权限Session认证所有视图&#xff08;全局&#xff09;启用认证视图级别启用认证 Token认证[推荐]安装APP启用Token认证生成数据库表(因为token要存储到数据库&#xff09;配置Token认证接口URL获取token使…