自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 说一下多线程?

多线程使用场景:如果有多个任务并且任务量巨大,使用多线程提高效率。线程状态:线程安全:1.多个线程对共享资源同时进行操作,会造成线程安全问题。为了保证线程安全需要满足原子性,可见性,有序性。解决方式:1.synchroized?说一下作用:基于对象头进行加锁,都同一个对象头加锁的线程同步互斥.1.synchroized底层原理和实现:mointor机制:基于mointor监视器,使用对象头锁的状态来进行加锁。;当使用javap反编译命令,会出现1个mointorenter+.

2021-03-19 18:02:31 458

原创 TCP协议

tcp:称为传输控制协议。tcp协议的格式确认应答机制tcp为每个字节都进行了编号,即为序列号每一个ack都带有确认序列号,意思告诉发送者下个数据从哪个序号开始发送超时重传机制1.主机A向主机B发送的数据包,由于网络拥堵等原因没有到达主机B,这时主机A会重新发送数据包。产生丢包有两种情况:第一种主机A向主机B发送的数据包丢失。第二种主机B向主机A发送的ack确认应答包丢失。超时时间如何确定?linux中超时以500ms进行控制,每次盘判定超时的时间都是50.

2021-03-18 21:48:52 250

原创 输入url后发生了什么?

1.浏览器进行地址解析,然后DNS域名解析。浏览器进行地址解析,会补全如源端口:80等信息dns域名解析分为以下步骤1.先查看浏览器dns缓存表中是否有域名对应的ip地址2.如果没有,查看操作系统的dns缓存中是否有对应的ip地址3.如果没有,就直接到本地区的dns服务器发起请求4如果还是没有。就直接到root server服务器上发起请求解析2.通过ip寻址和ARP协议,找到目标服务器ip地址,根据tcp协议三次握手建立连接。IP寻址:根据目的ip与子网掩码进行按位与.

2021-03-17 18:05:32 228

原创 个人博客项目总结

**项目描述:**个人博客实现了登录,发送新文章,删除,修改,并支持上传图片的功能。使用的技术有:1.maven:使用maven打包项目,来管理依赖。2.MySQL:使用数据库存储用户信息及文章列表,通过JDBC技术连接数据库。3.前端编写:使用html和ajax技术来编写前端页面。4.servlet:每个页面请求后端数据都需要实例servlet。5.tomcat:使用tomcat作为web项目部署服务器6.session:保持前后端会话的技术,需要登陆后才可以访问敏感资源。7.:请求数据是

2020-12-07 21:34:43 1070 1

原创 http协议格式总结

URL:我们俗称的网址就是url。如:大概了解组成部分有以下几个:1.协议部分:http: 为协议 而后面的//为分隔符,如何理解http协议,客户端发出一个请求,要想让服务端接收到就得遵守http协议,客户端和服务端都必须遵守此协议,负责数据传输会出现错误。2.域名:分为ip(逻辑地址):定位主机的位置和port(端口):定位主机中的某个进程(运行一个程序)举个列子当你建了一栋大楼,大楼的名字取名为ip,这个大楼中有许多房间也就是端口,每个房间供一个进程去使用。Http协议格式:面试重点

2020-11-20 23:19:31 725 1

原创 leetcode旧键盘与宝石石头练习题使用set

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。import java.util.*;public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); String old=scanner.nextLine(); //不考虑键盘损坏应读入的字

2020-11-01 20:21:58 133

原创 七大排序核心思路及其代码实现

稳定性:两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法是具备稳定性的排序算法。插入排序思路:将整个数组区间分为有序区间和无序区间,有序区间在前,无序区间在后,有序区间[0,i] 使用中括号表示一个数已经有序,即有序区间里有一个数,无序区间[i+1,arr.length),选出无序区间第一个数key,让其与有序区间进行比较,1.key小于有序区间最后个元素下标(j)则把最后一个元素赋值到下标(j+1)然后将key赋值到j+1下标下的位置,第二种情况 key大于等于直接将k

2020-10-31 23:59:56 321

原创 优先级队列(堆)

堆: 堆逻辑上是一棵完全二叉树, 堆物理上是保存在数组中。满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆。反之,则是小堆,或者小根堆,或者最小堆。向下调整,向上调整,建堆,代码实现public class lx { public static void adjustDown(int []array ,int size,int index){ while (true){ //左孩子的位置为index位置*2+1 in

2020-10-22 17:56:01 134

原创 树型结构及二叉树(重点)

树形结构:树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。特点:有一个特殊的节点,称为根节点,根节点没有前驱节点除根节点外,其余节点被分成M(M > 0)个互不相交的集合T1、T2、…、Tm,其中每一个集合 Ti (1 <= i<= m) 又是一棵与树类似的子树。每棵子树的根节点有且只有一个前驱,可以有0个或多个后继,树是递归定义的。节点的度:一个节点含有的子树的个数称为

2020-10-20 13:05:48 355

原创 栈和队列总结

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做

2020-10-05 15:48:50 231

原创 JAVA -认识异常

在编译期出现的异常,叫做受查异常。在运行期出现的异常,叫做非受查异常。防御式编程:1,LBYL: Look Before You Leap. 在操作之前就做充分的检查。2,it’s Easier to Ask Forgiveness than Permission. “事后获取原谅比事前获取许可更容易”. 也就是先操作, 遇到问题在处理捕获异常:try{有可能出现异常的语句 ;}[catch (异常类型 异常对象) {} … ][finally {异常的出口}]try 代码块中放的是可能

2020-08-07 18:13:20 164

原创 java 顺序表

public class MyArrayList{ int []elem; int useSize; public MyArrayList(){ elem=new int[5]; this.useSize=0; }// 在 pos 位置新增元素 public void add(int pos, int data) { if(pos<0||pos>useSize){ Syste

2020-07-27 23:16:18 155

原创 java-类和对象

类的成员可以包含以下:字段、方法、代码块、内部类和接口等。字段:在类中, 但是方法外部定义的变量. 这样的变量我们称为 “字段” 或 “属性” 或 “成员变量”。如果要访问类中的字段需要我们在用关键字“new”实例化一个对象,通过引用对象**.**成员变量来访问。static关键字:作用:当类中的成员方法或成员变量被static修饰时,此时若要访问则通过类名.成员.变量或类名.成员方法。两者区别:1.当被static修饰时,成员变量通过引用所在的内存区域在方法区,而未被static修饰通过引用在堆上开

2020-07-26 16:06:47 131

原创 java实现猜数字游戏和模拟用户登录界面

public static void main10(String[] args) { Scanner s=new Scanner(System.in); Random rnd=new Random(); int random=rnd.nextInt(100)+1; while(true){ System.out.println("请输入你要猜的数字:"); int n=s.nextInt(); if(n<random){ System.out.printl..

2020-07-20 18:06:41 1287

原创 java-常量,类型的转换,与运算符

常量与变量的区别:常量在编译期间就能够确定值,并且运行期间不可以改变值。变量运行期间可以改变值,并且是在运行时才知道值的大小。final关键字修饰常量 列 final int a=10; 此时a为常量,不能被修改。long和int 的相互转换int 和 double的相互转换总结:long 表示的范围更大, 可以将 int 赋值给 long, 但是不能将 long 赋值给 int.double 表示的范围更大, 可以将 int 赋值给 double, 但是不能将 double 赋值给 int.

2020-07-17 15:29:42 207

原创 java基础——变量的基本知识点

**整形变量:**语法:int 变量名 = 初始值; 一个int占4个字节 不管是在32位下 还是64位下。字节是计算机中表示空间大小的基本单位.计算机使用二进制表示数据. 我们认为 8 个二进制位(bit) 为一个字节(Byte).4 个字节表示的数据范围是 -2^31 -> 2^31-1 **长整型变量**:语法:long 变量名 = 初始值;一个long占8个字节 1. 基本语法格式和创建 int 变量基 本一致, 只是把类型修改成 long 2. 初始化设定的值为 10

2020-07-16 16:26:15 173

原创 写一个宏,计算结构体中某变量相对于首地址的偏移

题目:写一个宏,计算结构体中某变量相对于首地址的偏移#include<stdio.h>#define offsetof(a,b) ((char*)(&b)-(char*)(&a))typedef struct A{ char a; int b; double c;}A; //定义一个结构体int main(){ A p; //定义结构体变量 printf("%d", offsetof(p,p.c)); //结构体起始地址相当于c变量的偏移量为8

2020-07-15 21:55:09 406

原创 程序的环境和预处理

源文件--》编译器--》目标文件--》链接器《--链接库 | 可执行程序编译器需要进行预处理,编译,汇编。而连接器需要将目标文件和c库文件进行链接形成可执行程序。预处理需要进行头文件展开,去注释,宏替换,条件编译,编译是将c变成汇编代码,汇编是将汇编代码变成二进制目标文件。 1. 预处理 选项 gcc -E test.c -o test.i 预处理完成之后就停下来,预处理

2020-07-15 19:52:54 135

原创 通讯录的实现

#ifndef _CONTACT_H_#define _CONTACT_H_#include <stdio.h>#include <assert.h>#include <windows.h>#pragma warning(disable:4996)//person内部的元素的大小#define NAME_SIZE 32#define SEX_SIZE 8#define TELPHONE_SIZE 16#define ADDRESS_SIZE 12

2020-07-13 20:27:07 409

原创 模拟atoi的实现

#include<stdio.h>#include<Windows.h>#include<stdlib.h>#include<limits.h>#include<assert.h>#pragma warning(disable:4996)int status = 0; // 全局变量status表述错误代码,若为1 则发生越界问题,若为2,则说明有非法字符int my_atoi(const char*str){ assert(

2020-06-27 18:25:53 185

原创 找单身狗

void Finddog(int a[], int num, int*x, int*y){ int result = a[0]; for (int i = 1; i < num; i++){ result ^= a[i]; } int pos = 1; while (1) { if (result &pos){ break; } pos <<= 1; } *x = 0; *y = 0; for (int i = 0; i < num

2020-06-26 18:32:26 133

原创 动态内存管理总结

//动态内存空间是在堆上开辟的,而我们以前所知道的是在栈上开辟的。//什么时候使用堆空间? 空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。这时候就只能试试动态存开辟了//动态内存开辟函数void* malloc(size_t size)列子:#include <stdio.h>int main(){ //代码1 int num = 0; scanf("%d", &num); int arr[num] = {0

2020-06-24 15:11:40 142

原创 自定义类型:结构体,枚举,联合总结

结构体:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体的声明:例如描述一个学生:struct Stu{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号};//分号不能丢匿名结构体:struct{int a;char b;float c;}x;struct{int a;char b;float c;}a[20],*p; //两个结构体省略了结构体标签p=&

2020-06-20 14:46:43 135

原创 库函数 strlen strcpy strcmp strstr strcat memcpy memmove 小写转大写 函数实现

// 小写转大写 核心思想是与ASCII对应的值进行比较int my_islower(char c){ return c >= 97 && c <= 122;}int my_toupper(char c){ return my_islower(c) ? c - 32 : c;}int main(){ char str[] = "this is sring"; int len = strlen(str); int i = 0; for (; i &

2020-06-13 16:48:53 293

原创 字符串左旋

#include<stdio.h>#include<Windows.h>#include<string.h>#pragma warning(disable:4996)#include<assert.h> //方法一 子区间逆序得到左旋结果//void Reverse(char*str, int start, int end)//{// while (start < end){// char temp = str[st

2020-06-08 23:21:18 96

原创 指针和数组笔试题

int a[] = {1,2,3,4};printf("%d\n",sizeof(a)); // 16 当数组名在sizeof中单独使用时代表的是整个数组;printf("%d\n",sizeof(a+0)); // 4 此时a代表数组首元素地址(指针),所以大小为4printf("%d\n",sizeof(a)); //4 a代表数组首元素地址(指针),在进行解引用代表整形 元素‘1’占4个字节printf("%d\n",sizeof(a+1));//4 a代表数组首元素地址(指针),+

2020-06-08 11:40:42 252

原创 函数指针数组应用:计算器多文件编写

在这里插入代码片```#ifndef _CAL_H_#define _CAL_H_#include<stdio.h>#include<Windows.h>#pragma warning(disable:4996)int Myadd(int x, int y);int Mysub(int x, int y);int Mymul(int x, int y);int Mydiv(int x, int y);#endif```c在这里插入代码片```#i

2020-06-02 15:28:16 166

原创 指针传参的理解

一级指针对整数,整数数组,字符数组传参的几种方式:①void test(int p){}int main(){int a=10;intp=&a;test§;② void test(int *p){}int main(){int a=10;test(&a);③ void test(int *p){}int main(){int a[]={1,2,3,4};int *p=a;test§;}④void test(int *p){}int m

2020-05-30 15:20:39 428

原创 求两个数二进制中不同位的个数

在这里插入代码片int Num(int c){ int count = 0; while (c){ c &= (c - 1); count++; } return count;}int main(){ int a, b,c; printf("输入两个数:"); scanf("%d %d", &a, &b); c = a^b; int ret = Num(c); printf("二进制中不同位个数为:%d\n", ret); system("pa

2020-05-28 14:37:43 170

原创 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

在这里插入代码片```int main(){ int i = 0; int date = 0; int a[32] = { 0 }; printf("请输入一个数:"); scanf("%d", &date); for (i = 0; i < 32; i++){ a[i] = date % 2; date /= 2; } printf("偶数位为:"); for (i = 31; i >= 0; i -= 2){ printf("%d", a[i]);

2020-05-28 14:22:48 276

原创 深度剖析数据在内存中的存储

**整形在内存中的存储 **##*1.变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。例一int a = 20;int b = -10;char a=10;char b=20 ;char c=-10;要了解它们在内存中如何存储首先先得深度了解原反补码的概念;原码:该数据的绝对值的二进制序列;反码:符号位不变,将剩余二进制序列按位取反;补码:反码+1,注意:符号位要参与运算;数据的类型对应的原反补码无符号 : 原=反=补有符号:最高位代表符号位,正(0),负(

2020-05-26 11:50:42 148

原创 总持续时间可被60整除的歌曲

在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望索引的数字 i 和 j 满足 i < j 且有 (time[i] + time[j]) % 60 == 0。示例 1:输入:[30,20,150,100,40]输出:3解释:这三对的总持续时间可被 60 整数:(time[0] = 30, time[2] = 150): 总持续时间 180(time[1] = 20, time[3] = 100):

2020-05-25 16:13:30 151

原创 杨辉三角

在这里插入代码片```void Showyang(){ int arr[10][10] = { 0 }; int i = 0; int j = 0; for (; i < 10; i++){ for (j=0; j < i; j++){ arr[i][j] = 1; } } for (i = 2; i < 10; i++){ for (j = 1; j < i; j++){ arr[i][j] = arr[i - 1][j] + arr[i -

2020-05-24 19:09:13 136

原创 字符串逆序输出

在这里插入代码片```void reverstr(char *p){ int len = strlen(p); char *pi = p; char *pc = p + len - 1; int i = 0; char ch; for (; i < len / 2; i++){ ch = *pi; *pi =*pc; *pc = ch; pi++; pc--; }}int main(){ char p[] = "hello world!"; printf

2020-05-22 16:07:16 261

原创 输入一个数打印这个数的每一位

在这里插入代码片```void Show(int x){ int a[64] = { 0 }; int i = 0; while (x){ a[i] = x % 10; x = x / 10; i++; } while (i > 0){ i--; printf("%d ", a[i]); } printf("\n");}int main(){ int a = 0; printf("情输入你的数字:"); scanf("%d", &a); Sho

2020-05-22 15:32:42 273

原创 二分查找

在这里插入代码片```int main(){ int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int left = 0; int right = sizeof(arr)/sizeof(arr[0]); int key = 7; int mid = 0; while (left < right){ mid = (left + right) / 2; if (arr[mid]>key){ right = mid - 1; }

2020-05-21 14:14:32 118

原创 数组中元素奇数永远在偶数之前

在这里插入代码片```void Switch (int*arr,int num){ int *p = arr; int*pi = arr + num - 1; while (p < pi){ while (p < pi && (*p & 1)){ p++; } while (p < pi && !(*pi & 1)){ pi--; } if (p < pi){ *p ^= *pi; *

2020-05-20 15:19:02 120

原创 输出100到200之间的素数

在这里插入代码片int main(){ int i = 0; for (i = 100; i <= 200; i++){  int j = 0;  for (j = 2; j <= i - 1; j++){   if (i%j == 0)    break;  }   if (j == i){&n

2020-05-19 16:01:10 1337

原创 辗转相除法求最小公约数和最大公倍数

在这里插入代码片```#include<stdio.h>#include<Windows.h>#pragma warning(disable:4996)int main(){ int m, n, a, b, c; printf("请输入两个数:"); scanf("%d %d", &a, &b); m = a; n = b; while (b != 0){ c = a%b; a = b; b = c; } printf("最大公约

2020-05-18 15:24:21 343

原创 编写函数模拟strcpy函数功能

在这里插入代码片#include<stdio.h>#include<Windows.h>#pragma warning(disable:4996)#include<stdlib.h>#include<assert.h>char Mystrcpy(char* str, char* str1){ char* p = str; char* pi = str1; int len = strlen(str1); assert(p != NULL);

2020-05-16 15:11:58 251

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除