自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 杨氏矩阵:有一个二维数组,数组的每行从左到右都是递增的,每列从上到下都是递增的,从这样的数组中查找一个数字是否存在

要求:时间复杂度小于O(N) 如: 1 2 3 4 5 6 7 8 9 在这个数组中找7,找到则返回1,没找到则返回0int Findnum(int arr[3][3], int key, int rows, int cols){ int row = 0;//右上角下标 int col = cols-1; while ((row >= 0) && (col <=

2017-06-27 17:39:31 989 1

原创 调整数组使奇数全部位于偶数前面

void move_num(int arr[], int sz){ int left = 0; int right = sz - 1; while (left < right) { while ((left<right) && (arr[left] % 2 != 0))//是奇数 left++; while (

2017-06-27 16:56:33 348

原创 字符串操作:左旋转字符串,右旋转字符串,判断一个字符串是否是另一个字符串旋转所得

1,左旋字符串: 如:ABCDEFG 左旋3个后得到:DEFGABC第一种方法:void Re_left(char arr[],int k){ while (k--) { int i = 0; char tmp = arr[0]; int len = strlen(arr) - 1; for (i = 0; i <

2017-06-26 16:28:53 725

原创 C语言模拟实现库函数atoi

头文件:#include #include <stdio.h> #include <string.h> #include <assert.h> #include <ctype.h> int my_atoi(char const *p){ int ret = 0; int a = 0; int flag = 1; assert(p != NULL);

2017-06-24 00:47:16 609

原创 C语言实现无头单链表及链表相关面试题(重点!)

链表通常是面试中的重点,本文是用C语言写一个无头单链表,并介绍它的相关面试题的解法。 其中涉及到的面试题如下: 1. 比较顺序表和链表的优缺点,说说它们分别在什么场景下使用? 顺序表:内存中地址连续 长度不可变更 支持随机查找 可以在O(1)内查找元素 适用于需要大量访问元素的 而少量增添/删除元素的程

2017-06-17 23:45:04 924

转载 linux进程管理与调度:task_struct结构体

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux-进程管理与调度进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序

2017-06-15 10:39:13 1966

转载 时间复杂度和空间复杂度详解

没有挤公交来上班过,就不知道生活的压力有多大。算法的时间复杂度和空间复杂度合称为算法的复杂度。1.时间复杂度(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就

2017-06-15 09:54:54 467

原创 冒泡排序和选择排序(C++实现)

冒泡排序:从数组的第一个元素开始(arr[0]),两两比较(arr[n],arr[n+1]),如果前面的数大于后面的数,则交换两个元素的位置,把大的数往后移动。经过一轮比较后,最大的数会被交换到最后的位置(arr[n-1])。选择排序:通过比较,选出每一轮中最值元素(最大或最小),然后把它和本轮中的第一个元素进行交换,所以这个算法的关键是要记录每次比较的结果,即每次比较后的最值位置(下标)。冒泡排序

2017-06-15 00:37:38 751

原创 linux:死锁形成原因以及四个必要条件,避免死锁的方法

前面我们已经介绍过线程的基本概念,我们知道,同一个进程中的多个线程共用一份公共资源,这样就有可能造成互相争夺资源互相等待对方让步的问题,若双方都不肯让步,就会一直等待,这就是死锁。死锁形成的原因: (1)系统资源不足,不能满足进程的资源要求,会导致多个线程争夺同一份资源 (2)进程(线程)推进的顺序不恰当 (3)资源分配不当死锁出现的场景: (1)多个线程:彼此申请对方资源而导致的死锁。A申

2017-06-13 09:41:04 1807

原创 linux进程间通信:匿名管道和命名管道

进程间通信的本质是让不同的进程看到一份公共的资源 上图中,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制成为进程间通信。(一)匿名管道 管道是一种最基本的IPC(进程间通信)机制,由pipe函数创建#include<unistd.h>int pipe(int filedes)filedes参数传给用户两个文件描述符,filedes[0]指向文件的读

2017-06-09 11:41:59 725

原创 linux共享内存

内存共享: 两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。效率: 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次

2017-06-08 01:27:01 1598

原创 linux消息队列实现进程间通信

进程间通信(IPC):进程间通信的本质就是通过让不同的进程看到一份公共的资源来实现通信。 常用的进程间通信的方式有两种:通过管道和systemv标准,今天我们来介绍systemv标准中的一种:消息队列消息队列:消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,每个数据块都认为是有一个类型,接受者进程接收的数据块可以有不同的类型值。我们可以通过发送消息来避免命名管道的同步和阻塞问题

2017-06-07 22:22:30 3521

原创 Linux线程的基础知识

之前我们已经介绍过进程的基本概念,那么线程是什么? 线程是进程内部的一个执行分支,举个栗子:比如一个项目的完成是多个团队之间的合作,和每个团队都是这个项目运行的一个分支。即线程是进程内部的执行分支。进程的特点: (1)系统中程序执行和资源分配的基本单位 (2)每个进程都有自己的数据段、代码段、堆栈区 (3)在进行切换时需要比较复杂的上下文切换线程特点: (1)减少处理机的空转时间,支持多处

2017-06-07 01:24:59 605

原创 数据结构 二叉树(binarytree)的实现

我们先来介绍一些关于树的概念:节点:结点包含数据和指向其它节点的指针。 根节点:树第一个结点称为根节点。 结点的度:结点拥有的子节点个数。 叶节点:没有子节点的节点(度为0)。 父子节点:一个节点father指向另一个节点child,则child为孩子节点,father为父亲节点 。 兄弟节点:具有相同父节点的节点互为兄弟节点。 节点的祖先:从根节点开始到该节点所经的所有节点都可以称为该

2017-06-02 17:53:43 811

空空如也

空空如也

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

TA关注的人

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