【C++写详细总结①】从for循环到算法初步

【C++写详细总结①】从for循环到算法初步
前言

本文通过小编自身学习的进程从而总结出本文,也希望大家可以好好学习,帮助到自己
这个是萌新考场救场代码,与本文一起食用更佳

for循环计数器

for(定义计数变量;定义结束条件;每次循环所做的动作) 
示例
for(int i=1;i<=10;i++) //首先定义“i”变量作为计数数组,赋初值为“1”//然后每次循环判断条件是否成立,不成立则退出//最后每循环执行条件,此示例为每循环“i”增加1

而计数器就是在for循环有了一定执行范围的基础上创建了一个数组,进行++计数

示例
#include<iostream>// 万年不变的框架usingnamespace std;intmain(){int n; cin>>n;//输入数值表示从1~n中有几个数字int cnt=0;//注意计数器赋初值建议为“0”//因为不赋值会野值(顾名思义会瞎生成一个值)for(int i=1;i<=n;i++){ cnt++;//cnt数组自增//cnt+=1;或cnt=cnt+1;效果同样。} cout<<cnt;//输出计数器}
练习题目1:

题目描述

斐波那契数列是一个特殊的数列:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55……

数列的第一项和第二项都是1,从第三项开始,每一项是其前面两项之和。
输入正整数 n ,编程输出该数列的第 n 项。

输入描述

一个整数 n 。

输出描述

一个整数,斐波那契数列的第 n 项。

#include<iostream>usingnamespace std;longlong a[55];intmain(){int n; cin>>n;//输入要求斐波那契数列的第几位 a[1]=1,a[2]=1;//把前两位设为1for(int i=3;i<=n;i++){ a[i]=a[i-1]+a[i-2];//把前两个元素相加变为第三个元素} cout<<a[n];//输出要求的元素位置return0;}
建议进阶练习:练习题目2

洛谷题目传送门

函数与模块化编程

#include<iostream>usingnamespace std;longlong a[55];//全局变量全局都可以使用//而主函数里的n只能在主函数内使用intfbnq(int n){ a[1]=1,a[2]=1;for(int i=3;i<=n;i++){ a[i]=a[i-1]+a[i-2];//公式还是那样,但是变成函数内部了}return a[n];//函数需要返回值哦(void函数除外)//没有返回值函数再怎么写也没用哦}intmain(){int n; cin>>n; cout<<fbnq(n);//记得上面定义时括号里写东西了//这里就也要写东西return0;}
各种函数特点与用法
函数类型特点用法
int返回值为int类型int 函数名(int 新创建变量的名称)
long long返回值为long long 类型long long 函数名(long long 新创建变量的名称)
bool返回值类型为bool,即不是true就是falsebool 函数名 (bool 新创建的变量名称
void无返回值,函数内不要有reutrn,若有,请注意很有可能报错,强制停止此函数运行请写"return;"void 函数名 (int 新创建的变量名)

小提示:类型 函数名(int/long long/bool/其他类型 新创建的变量名)输入变量名的类型void是不合法的!若使用了会报错

练习题目1:

学而思网校提供:

在这里插入图片描述


在这里插入图片描述
#include<cstdio>#include<cmath>usingnamespace std;//定义函数intexpress(double w)//定义输入数据{//以下是本题核心代码int money; w=round(w*10)/10;if(w<=1){ money=13;}else{ w=ceil((w-1)/0.5); money=13+w;}return money;//输出花费}intmain(){double w;scanf("%lf",&w);printf("%d\n",express(w));//直接套用函数输出值输出return0;}

建议:可以再洛谷上寻找一些简单题目专门用函数来写,进行练习。

多重循环(for循环plus版)

模板:

for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){//此模板还可以不断叠层//这段模板内出现的所有变量名均可替换:i,j,n}}

闲话不多说,直接上题目

练习题目1:

洛谷USACO题目饲料调配

在这里插入图片描述
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespace std;typedeflonglong LL;intmain(){int a,b,c;//输入数据 cin>>a>>b>>c;int a1,b1,c1; cin>>a1>>b1>>c1;int a2,b2,c2; cin>>a2>>b2>>c2;int a3,b3,c3; cin>>a3>>b3>>c3;for(int i=0;i<100;i++)//使用三重for循环{for(int j=0;j<100;j++)//以后做其他题使用三重for循环须慎重(可能会超时){for(int k=0;k<100;k++){if(!i&&!j&&!k){continue;}int x=a1*i+a2*j+a3*k;//进行题目内要求的计算int y=b1*i+b2*j+b3*k;int z=c1*i+c2*j+c3*k;if(x*b==y*a&&y*c==b*z&&x%a==0){ cout<<i<<" "<<j<<" "<<k<<" "<<x/a<<endl;return0;//输出答案结束程序}}}} cout<<"NONE";//若前方未结束程序输出无正解return0;}
练习题目2:

感谢大自然的馈赠

在这里插入图片描述


可以自己之后去练习

while循环

//while循环本质逻辑与for循环大差不差,所以小编就不在这里过多废话了while(true)//每次循环判断此条件是否成立,成立即继续运行,不成立则反之{ cout<<"作者真帅";}
练习题目1:
在这里插入图片描述
练习题目2:
题目描述

数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于 24 来说,把 2 和 4 相加得到 6,由于 6 是一位数,因此 6 是 24 的数根。再比如 39,把 3 和 9 加起来得到 12,由于 12 不是一位数,因此还得把 1 和 2 加起来,最后得到 3,这是一个一位数,因此 3 是 39 的数根。

输入描述

一个整数n,(1 <= n <= 10^9)

输出描述

一个数字,即n的数根

样例1
输入

39

输出

3

结构体

C++结构体的基本概念

在C++中,结构体得到了极大的增强,几乎和类一样强大,唯一区别是默认访问权限为public(类为private)。

#include<iostream>#include<string>usingnamespace std;// C++结构体定义structStudent{ string name;// C++中可以直接使用stringint age;float score;};intmain(){// 创建结构体变量 Student stu1;// C++中不需要写struct关键字 stu1.name ="张三"; stu1.age =20; stu1.score =85.5; cout <<"姓名:"<< stu1.name << endl; cout <<"年龄:"<< stu1.age << endl; cout <<"成绩:"<< stu1.score << endl;return0;}
结构体的定义方式
基本定义
#include<iostream>#include<string>usingnamespace std;// 方式1:普通定义structPerson{ string name;int age; string phone;};// 方式2:定义时创建对象structCar{ string brand; string model;int year;} car1, car2;// 全局对象intmain(){// 方式3:使用typedef(C++中不太需要)typedefstruct{ string city; string street;int number;} Address; Address addr ={"北京","长安街",1}; Person p;// 直接使用,不需要struct关键字 Car myCar;// 局部对象return0;}
结构体的初始化
多种初始化方法
#include<iostream>#include<string>usingnamespace std;structStudent{ string name;int age;float score;};intmain(){// 方法1:聚合初始化(C++11起) Student stu1 ={"张三",20,85.5};// 方法2:指定成员初始化(C++11起) Student stu2 ={.name ="李四",.age =21,.score =92.0};// 方法3:使用构造函数(结构体可以有构造函数) Student stu3("王五",22,88.5);// 如果有构造函数的话// 方法4:默认初始化 Student stu4{};// name为空,age=0,score=0// 方法5:逐个赋值 Student stu5; stu5.name ="赵六"; stu5.age =23; stu5.score =90.5;// 输出验证 cout << stu1.name <<" "<< stu1.age <<" "<< stu1.score << endl; cout << stu4.name <<" "<< stu4.age <<" "<< stu4.score << endl;// 0 0return0;}
结构体成员访问
#include<iostream>#include<string>usingnamespace std;structPoint{int x;int y;// 成员函数voiddisplay(){ cout <<"Point("<< x <<", "<< y <<")"<< endl;}// 计算到原点的距离doubledistance(){returnsqrt(x*x + y*y);}};intmain(){ Point p1 ={3,4};// 直接访问 cout <<"x = "<< p1.x <<", y = "<< p1.y << endl;// 调用成员函数 p1.display(); cout <<"到原点的距离:"<< p1.distance()<< endl;// 指针访问 Point *ptr =&p1; ptr->x =5; ptr->y =12; cout <<"修改后:"; ptr->display();return0;}
结构体数组
#include<iostream>#include<string>#include<iomanip>usingnamespace std;structStudent{ string name;int age;float score;};intmain(){// 定义并初始化结构体数组 Student class1[3]={{"张三",20,85.5},{"李四",21,92.0},{"王五",22,88.5}}; cout <<"班级学生信息:"<< endl; cout <<setw(10)<<"姓名"<<setw(6)<<"年龄"<<setw(8)<<"成绩"<< endl; cout <<"------------------------"<< endl;// 遍历数组for(int i =0; i <3; i++){ cout <<setw(10)<< class1[i].name <<setw(6)<< class1[i].age <<setw(8)<< fixed <<setprecision(1)<< class1[i].score << endl;}// 动态分配结构体数组 Student* class2 =new Student[2]; class2[0]={"赵六",19,78.5}; class2[1]={"孙七",20,95.0};delete[] class2;// 释放内存return0;}
结构体嵌套
#include<iostream>#include<string>usingnamespace std;// 地址结构体structAddress{ string city; string street;int number;voidshow(){ cout << city <<" "<< street <<" "<< number <<"号";}};// 联系方式结构体structContact{ string phone; string email;};// 学生结构体嵌套其他结构体structStudent{ string name;int age; Address addr;// 嵌套Address Contact contact;// 嵌套ContactvoidshowInfo(){ cout <<"姓名:"<< name << endl; cout <<"年龄:"<< age << endl; cout <<"地址:"; addr.show(); cout <<"\n电话:"<< contact.phone << endl; cout <<"邮箱:"<< contact.email << endl;}};intmain(){ Student stu ={"张三",20,{"北京","长安街",1},{"13800138000","[email protected]"}}; stu.showInfo();// 访问嵌套成员 cout <<"\n城市:"<< stu.addr.city << endl; cout <<"电话:"<< stu.contact.phone << endl;return0;}
结构体与函数
#include<iostream>#include<string>usingnamespace std;structRectangle{double width;double height;doublearea(){return width * height;}};// 值传递voidprintRect1(Rectangle r){ cout <<"宽:"<< r.width <<",高:"<< r.height <<",面积:"<< r.area()<< endl;}// 引用传递(避免复制)voidprintRect2(const Rectangle &r){ cout <<"宽:"<< r.width <<",高:"<< r.height <<",面积:"<< r.area()<< endl;}// 指针传递voidmodifyRect(Rectangle *r,double w,double h){ r->width = w; r->height = h;}// 返回结构体 Rectangle createRect(double w,double h){return{w, h};// C++11的统一初始化}intmain(){ Rectangle r1 ={10,5};printRect1(r1);// 值传递printRect2(r1);// 引用传递modifyRect(&r1,20,10); cout <<"修改后:";printRect2(r1); Rectangle r2 =createRect(15,8); cout <<"新矩形:";printRect2(r2);return0;}
结构体与运算符重载
#include<iostream>usingnamespace std;structVector2{float x, y;// 构造函数Vector2(float x =0,float y =0):x(x),y(y){}// 运算符重载 Vector2 operator+(const Vector2& other)const{returnVector2(x + other.x, y + other.y);} Vector2 operator*(float scalar)const{returnVector2(x * scalar, y * scalar);}// 友元函数重载<<运算符friend ostream&operator<<(ostream& os,const Vector2& v){ os <<"("<< v.x <<", "<< v.y <<")";return os;}};intmain(){ Vector2 v1(3,4); Vector2 v2(1,2); Vector2 v3 = v1 + v2; Vector2 v4 = v1 *2; cout <<"v1 = "<< v1 << endl; cout <<"v2 = "<< v2 << endl; cout <<"v1 + v2 = "<< v3 << endl; cout <<"v1 * 2 = "<< v4 << endl;return0;}
结构体与动态内存
#include<iostream>#include<string>usingnamespace std;structNode{int data; Node* next;// 自引用结构体(链表节点)Node(int val):data(val),next(nullptr){}};structDynamicArray{int* arr;int size;DynamicArray(int n):size(n){ arr =newint[size];for(int i =0; i < size; i++){ arr[i]= i *10;}}~DynamicArray(){delete[] arr; cout <<"内存已释放"<< endl;}voiddisplay(){for(int i =0; i < size; i++){ cout << arr[i]<<" ";} cout << endl;}};intmain(){// 链表示例 Node* head =newNode(1); head->next =newNode(2); head->next->next =newNode(3);// 遍历链表 Node* current = head;while(current){ cout << current->data <<" "; current = current->next;} cout << endl;// 释放链表内存while(head){ Node* temp = head; head = head->next;delete temp;}// 动态数组结构体 DynamicArray da(5); da.display();// da的析构函数会自动释放内存return0;}
结构体 vs 类的对比
#include<iostream>usingnamespace std;// 结构体 - 默认publicstructMyStruct{int a;// 默认publicvoidfunc(){// 默认public cout <<"Struct function"<< endl;}};// 类 - 默认privateclassMyClass{int a;// 默认privatepublic:voidfunc(){ cout <<"Class function"<< endl;}};// 实际使用中,结构体常用于:// 1. 简单的数据容器// 2. 与C语言兼容的代码// 3. 不需要封装和继承的简单对象structPoint{int x, y;};// 类用于:// 1. 复杂的对象// 2. 需要封装和继承// 3. 有复杂的成员函数classShape{private: Point center;public:virtualvoiddraw()=0;};intmain(){ MyStruct s; s.a =10;// 可以直接访问 s.func(); MyClass c;// c.a = 10; // 错误!私有成员 c.func();// 公有成员函数return0;}
实用示例:学生成绩管理系统
#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespace std;// 学生结构体structStudent{ string id; string name;int age;double score;// 构造函数Student(string id, string name,int age,double score):id(id),name(name),age(age),score(score){}// 显示学生信息voiddisplay()const{ cout <<"学号:"<< id <<",姓名:"<< name <<",年龄:"<< age <<",成绩:"<< score << endl;}};// 班级结构体structClass{ string className; vector<Student> students;voidaddStudent(const Student& stu){ students.push_back(stu);}voidshowAll(){ cout <<"\n=== "<< className <<" 学生列表 ==="<< endl;for(constauto& stu : students){ stu.display();}}doublegetAverageScore(){if(students.empty())return0;double sum =0;for(constauto& stu : students){ sum += stu.score;}return sum / students.size();}voidsortByScore(){sort(students.begin(), students.end(),[](const Student& a,const Student& b){return a.score > b.score;});}};intmain(){ Class c1 ={"计算机1班"};// 添加学生 c1.addStudent({"2024001","张三",20,85.5}); c1.addStudent({"2024002","李四",21,92.0}); c1.addStudent({"2024003","王五",20,78.5}); c1.addStudent({"2024004","赵六",22,95.0});// 显示所有学生 c1.showAll();// 计算平均分 cout <<"\n班级平均分:"<< c1.getAverageScore()<< endl;// 按成绩排序 c1.sortByScore(); cout <<"\n=== 按成绩排序后 ==="; c1.showAll();return0;}

ASCLL码

ASCLL码就像一个字符的身份证,每一个字符都有一个数字来代表,而怎么判断一个字符的“身份证”是多少呢,请看下面示例

#include<iostream>usingnamespace std;intmain(){char s='A';//必须要char类型的int a=s;//用int来转换字符,变为数字 cout<<a;//最后输出转换好的数字return0;}

有一个小提示,字符A-Z是挨在一起的,所以我们知道了A的身份证是65,就可以推出B的字符是66,以此类推,注意,小写字符和大写字符不是挨在一起的,所以需要记好“a”的身份证是97。

以下是我在菜鸟教程里搜索到的ASCLL码表

在这里插入图片描述


推荐大家可以使用菜鸟教程这个网站

string类型

不知道大家是否学过python的字符串,在python中,字符串是可以像数组那样进行下表操作的。而不幸的是,C++中正常的char类型字符串无法进行下表操作,而string类型可以。不过请注意,string类型没有负索引这个东西:


练习题目1:

题目描述
有 N 只史莱姆排成一排,每只的颜色用一个英文小写字母表示,所有史莱姆的颜色排列成一个字符串 S。
接下来同样颜色的史莱姆会融合成一只,直到所有相邻的史莱姆颜色都不同。问最后剩下几只史莱姆?

输入格式
第1行,1个正整数 N
第2行,字符串 S ,表示每只史莱姆的颜色

输出格式
输出最后剩下史莱姆的数量

输入样例#1
10
aabbbbaaca

输出样例#1
5

#include<iostream>usingnamespace std;intmain(){int n; cin >> n; string s; cin >> s;int count =1;//计数器for(int i =1; i < n; i++){if(s[i]!= s[i-1])//判断有几只不同的史莱姆(因为如果有不同的就不会计数){ count++;}} cout << count << endl;return0;}

string 字符串操作

string字符串边界代码表格:

在这里插入图片描述
字符串拼接:

两个字符串是可以像加法一般拼在一起的,请看示例:

string s="作者"; string n="真帅"; string m=s+n; cout<<m;

运行这段代码后终端会显示出“作者真帅这四个字”

在这里插入图片描述
练习题目1:

洛谷-贪婪的送礼者

在这里插入图片描述


以下是AC代码,可以用来做对拍

#include<bits/stdc++.h>//万能头文件,十分好用,建议背下来usingnamespace std; map<string,int>money;int n,l,have; string name[105],x,buddy;intmain(){ cin>>n;for(int i=1;i<=n;i++) cin>>name[i];for(int i=1;i<=n;i++){ cin>>x>>have>>l;if(l==0)continue; money[x]-=have;int give=floor(have/l); money[x]+=(have-l*give);for(int i=1;i<=l;i++){ cin>>buddy; money[buddy]+=give;}}for(int i=1;i<=n;i++) cout<<name[i]<<" "<<money[name[i]]<<endl;return0;}

递归初步

1.1 递归的含义与历史

递归是计算机科学的一个不可分割的算法。就像西方不能失去耶路撒冷一样 递归指的是一个函数直接或间接读取自己的过程。但在我们使用递归的时候要注意不要写成死循环,并且我们也要明确我们写这个递归的目的,要逐步地把问题缩小化

1.2 举个栗子

递归死循环:

在小明小的时候听过这样的一个故事:从前有座山,山中有座庙,庙里有个老和尚,老和尚在讲故事,讲的是什么呀?从前有座山,山中有座庙,庙里有个老和尚在讲故事……

像这样的故事没有丝毫特点,就像你写死循环的时候重复给机器讲一个“故事”,机器就会困得睡着了,因此就“睡着了”。

1.3 代码示例

intdg(int n){if(n==87)//结束条件{return1;}returndg(n+1);//引用时n+1}

练习题目1:
在这里插入图片描述


此题为欧几里得公式递归写法,AC代码如下:

#include<bits/stdc++.h>usingnamespace std;intgcd(int a,int b){if(a%b==0){return b;}else{returngcd(b,a%b);//欧几里得算法公式}}intmain(){int a, b; cin >> a >> b; cout <<gcd(a, b);//其实万能头下__gcd(a,b)可以直接出答案return0;}
拔高题目1:
在这里插入图片描述


这道题难度较高,使用了我们还未学到的回溯算法,可以自己深研以下
AC代码:

#include<iostream>usingnamespace std;int n,m,p[15],ans;bool vis[15];voiddfs(int step){if(step==n+1){int sum=0;for(int i=1;i<=n;i++){if(vis[i]==1){ sum+=p[i];}}if(sum==m){ ans++;}return;} vis[step]=1;dfs(step+1); vis[step]=0;dfs(step+1);}intmain(){ cin>>n>>m;for(int i=1;i<=n;i++){ cin>>p[i];}dfs(1); cout<<ans<<endl;return0;}

回溯法

1.1 前言

在上一个知识点递归初步里的拔高题目AC代码使用了回溯法,在这个知识点部分我们来学习回溯法。

1.1.1 什么是回溯法?
小明:老师,回溯法是啥捏,是时空大回溯吗。
老师:对也不完全对,回溯指的是在做题时一种试错过程中不可缺少的部分。比如说……
小明:老师!也就是说回溯就是一种不撞南墙不回头的做法呗。
老师:对了,我们如果发现一种路线不可行,那么我们立即使用下一条路线,而回到原来选择的那个分支的方法,我们称为回溯法,或者说这也是种枚举的过程
1.1.2 回溯法有什么用呢

有人说,回溯法的底层逻辑就是递归,有回溯的地方就有递归。而回溯在做背包一类的题目中有显著优势,背包这个东西我们后文会提到。

2.回溯模板

这是一道全排列枚举题目:

在这里插入图片描述


AC代码

#include<cstdio>#include<cstring>#include<iostream>usingnamespace std;bool vis[10];int plan[10];int n;voiddfs(int step){if(step==n+1){for(int i=1;i<=n;i++){ cout<<plan[i]<<" ";} cout<<endl;return;}for(int i=1;i<=n;i++){if(vis[i]==1){continue;} plan[step]=i;//回溯核心部分 vis[i]=1;dfs(step+1);//调用自己,递归操作 vis[i]=0;}}intmain(){ cin>>n;dfs(1);return0;}

高精度算法

在大家的小学时期怎样计算两个数相加呢,想必有的人会使用竖式的方法,而高精度就是来模拟竖式加法,如下图所示:

在这里插入图片描述

正在更新中……

Read more

又一个项级的 Java Multi Agent 开源项目

又一个项级的 Java Multi Agent 开源项目

你好,我是阿香。 前几天,技术群里的小伙伴一直在安利 Solon AI。起初我还在想,Java 生态里不是已经有 Spring AI 了吗?出于好奇,我抽空深入研究了一波,结果真香了! 这不仅是一个 AI 框架,它更像是为 Java 开发者量身定制的 “智能体指挥部”。今天就来聊聊这个让我眼前一亮的顶级 Java Multi-Agent 开源项目。 什么是 Solon AI? 简单来说,Solon AI 是 Solon 生态中专注 AI 应用开发的轻量级框架。如果说大语言模型(LLM)是 AI 的大脑,那么 Solon AI 就是它的 “神经中枢” 和 “拓扑指挥官”。 它不仅仅提供了多智能体协作的架构,

By Ne0inhk
Java中的日期时间API详解:从Date、Calendar到现代时间体系

Java中的日期时间API详解:从Date、Calendar到现代时间体系

文章目录 * 引言:Java日期时间处理的演进之路 * 第一章:时间的基础概念 * 1.1 时间原点:1970-01-01 UTC * 1.2 时间表示的两种模型 * 1.3 时区与历法 * 第二章:第一代日期时间API——Date * 2.1 Date类的源码剖析 * 2.2 Date类的核心方法详解 * 2.2.1 创建Date对象 * 2.2.2 日期比较 * 2.2.3 获取/设置毫秒数 * 2.3 Date类的设计缺陷(为什么被废弃) * 缺陷1:年份从1900年开始 * 缺陷2:月份从0开始 * 缺陷3:可变性导致的线程安全问题 * 缺陷4:国际化支持薄弱

By Ne0inhk
【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)

【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)

文章目录 * 【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细) * 1. JDK介绍 * 2. 下载 JDK * 3. 安装 JDK * 4. 配置环境变量 * 5. 验证安装 * 6. 创建并测试简单的 Java 程序 * 6.1 创建 Java 程序: * 6.2 编译和运行程序: * 6.3 在显示或更改文件的扩展名(文件后缀) 【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细) 1. JDK介绍 JDK(Java Development Kit) 是 Java 程序开发的核心工具包,包含了开发 Java

By Ne0inhk
【前端基础】HTML + CSS + JavaScript 快速入门(一):HTML 详解

【前端基础】HTML + CSS + JavaScript 快速入门(一):HTML 详解

【前端基础】HTML + CSS + JavaScript 快速入门(一):HTML 详解 我的主页:寻星探路个人专栏:《JAVA(SE)----如此简单!!! 》《从青铜到王者,就差这讲数据结构!!!》 《数据库那些事!!!》《JavaEE 初阶启程记:跟我走不踩坑》 《JavaEE 进阶:从架构到落地实战 》《测试开发漫谈》 《测开视角・力扣算法通关》《从 0 到 1 刷力扣:算法 + 代码双提升》 《Python 全栈测试开发之路》没有人天生就会编程,但我生来倔强!!! 寻星探路的个人简介: 【前端基础】HTML + CSS + JavaScript 快速入门(一):HTML 详解 摘要:本文是前端开发系列教程的第一篇。我们将从零开始认识 HTML 的基本结构,

By Ne0inhk