牛客网题目六

1.广义表即我们通常所说的列表(lists)。它放松了对表元素的原子性限制,允许他们有自身结构。

广义表的长度:最大括号中的 逗号数+1

广义表的深度:展开后含括号的层数。

2.数组和矩阵不同,数组元素可以是字符,即字符数组,矩阵中都是数

3.环境变量可在编译source code时指定

javac一次可同时编译数个Java源文件

javac.exe能指定编译结果要置于哪个目录(directory)

4.通过反射可以动态的实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法。

通过反射,可以突破Java语言提供的对象成员、类成员的保护机制,访问一般方式不能访问的成。

Java的反射机制会给内存带来额外的开销。例如对永生堆的要求比不通过反射要求的更多。

5.覆盖索引:SQL只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据。

 覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据,有以下优点:

 1)、索引项通常比记录要小,所以MySQL访问更少的数据。

 2)、索引都按值得大小存储,相对于随机访问记录,需要更少的I/O。

 3)、数据引擎能更好的缓存索引,比如MyISAM只缓存索引。

 4)、覆盖索引对InnoDB尤其有用,因为InnoDB使用聚集索引组织数据,如果二级索引包含查询所需的数据,就不再需要在聚集索引中查找了。

 限制:

 1)、覆盖索引也并不适用于任意的索引类型,索引必须存储列的值。

 2)、Hash和full-text索引不存储值,因此MySQL只能使用BTree。

 3)、不同的存储引擎实现覆盖索引都是不同的,并不是所有的存储引擎都支持覆盖索引。

 4)、如果要使用覆盖索引,一定要注意SELECT列表值取出需要的列,不可以SELECT * ,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。

6.

内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序

用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取。

简单来讲一个进程由于执行系统调用而开始执行内核代码,我们称该进程处于内核态中. 一个进程执行应用程序自身代码则称该进程处于用户态.

为什么要有用户态和内核态

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态

用户态与内核态的切换

所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作.

这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令

这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)

他们的工作流程如下:

  1. 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务.
  2. 用户态程序执行陷阱指令
  3. CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问
  4. 这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务
  5. 系统调用完成后, 操作系统会重置CPU为用户态并返回系统调用的结果。

7.快速排序和堆排序的平均时间复杂度都是O(nlogn)

快速排序最差 n平方 归并排序最差nlogn

快速排序空间复杂度 logn 堆排序1

快速排序最好复杂度 nlogn 希尔排序n的1.3-2次方

8.UDP协议的特点 :没有拥塞控制

9.不能用来修饰interface的有 :private static protected

10.关于windows的消息机制

SendMessage等待消息处理完成后返回

线程可以没有消息队列

11. Windows中,以下关于动态链接库(DLL)的说法

DLL中可以导出变量

DLL不可以脱离EXE独立运行

12.软件工程的基本原则包括:抽象,信息隐蔽,模块化,局部化,确定性,一致性,完备性,可验证性。

13.进程的描述

进程是动态的概念

进程的执行需要CPU

进程具有生命周期

14.数据存储和数据流都是(  数据  ),仅仅是所处的状态不同

15.进程通信的途径:管道,信号量,消息队列,共享内存

16.

c语言中的union 是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值;

(1)32位:double 8字节,long 4字节,则最终12字节;

(2)64位:double8字节,long8字节,最终16字节

17.

基于TCP(面向连接)的Socket编程 
一、客户端: 
1、打开一个套接字(Socket); 
2、发起连接请求(connect); 
3、如果连接成功,则进行数据交换(read、write、send、recv); 
4、数据交换完成,关闭连接(shutdown、close); 
二、服务器端: 
1、打开一个套接字(Socket); 
2、将套接字绑定到服务器地址上(bind); 
3、指定套接字为服务器套接字(listen),做好连接请求准备; 
4、等待连接请求(connect); 
5、如果连接请求到,则连接建立,进行数据交换(read、write、send、recv); 
6、数据交换完成,关闭连接(shutdown、close); 
  
基于UDP(面向无连接)的Socket编程 
一、客户端\服务器端: 
1、打开一个套接字(Socket); 
2、将套接字绑定到指定的服务器地址和端口上(bind); 
3、进行数据交换(read、write、send、recv); 
4、数据交换完成,关闭连接(shutdown、close); 
  
三、MFC对Socket的支持: 
1、创建CAsyncSocket对象; 
2、发送接收数据报(SendTo、RecvFrom); 
3、连接服务器(Connect); 
4、接收连接(Listen); 
5、发送和接收流式数据(Send、Receive); 
6、关闭套接字(Close); 
7、差错处理(GetLastError) 

18.

java.lang.Object

    java.lang.Throwable

        java.lang.Error

        java.lang.Exception

            java.lang.Exception.RuntimeException

throw指令能够抛出Throwable及其子类

 

 

 

使用 Python 编写爬虫程序抓取牛客网题目信息,需要结合网络请求和网页解析技术。以下是实现该功能的步骤和代码示例。 ### 1. 准备工作 - **安装必要的库**:使用 `requests` 发送 HTTP 请求,使用 `lxml` 或 `BeautifulSoup` 解析 HTML 页面,也可以使用 `selenium` 模拟浏览器操作。 - **分析网页结构**:通过浏览器开发者工具(F12)查看目标网页的 HTML 结构,找到题目和答案所在的标签。例如,根据提供的信息,答案位于 `class="design-answer-box"` 的标签中。 ### 2. 使用 `requests` 和 `BeautifulSoup` 爬取静态页面 如果牛客网题目信息是静态加载的,可以直接使用 `requests` 获取页面内容,并使用 `BeautifulSoup` 解析 HTML。 ```python import requests from bs4 import BeautifulSoup # 设置请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } # 发送 GET 请求 url = 'https://www.nowcoder.com/' response = requests.get(url, headers=headers) # 解析 HTML 内容 soup = BeautifulSoup(response.text, 'html.parser') # 查找题目答案所在的标签 answers = soup.find_all('div', class_='design-answer-box') for answer in answers: print(answer.get_text(strip=True)) ``` ### 3. 使用 `selenium` 处理动态加载内容 如果牛客网的内容是通过 JavaScript 动态加载的,`requests` 无法直接获取完整的 HTML 内容,此时可以使用 `selenium` 来模拟浏览器操作。 ```python from selenium import webdriver from selenium.webdriver.common.by import By import time # 设置浏览器驱动路径 driver = webdriver.Chrome(executable_path='/path/to/chromedriver') # 打开目标网页 driver.get('https://www.nowcoder.com/') # 等待页面加载完成 time.sleep(5) # 查找题目答案所在的标签 answers = driver.find_elements(By.CLASS_NAME, 'design-answer-box') for answer in answers: print(answer.text) # 关闭浏览器 driver.quit() ``` ### 4. 使用 XPath 提取特定数据 根据提供的 XPath 路径 `/html/body/div[1]/div[2]/div[2]/div[2]/div[1]`,可以使用 `lxml` 或 `selenium` 提取特定节点的内容。 ```python from lxml import html # 解析 HTML 内容 tree = html.fromstring(response.text) # 使用 XPath 提取数据 answer_text = tree.xpath('/html/body/div[1]/div[2]/div[2]/div[2]/div[1]/text()') print(answer_text) ``` ### 5. 遵守网站规则 在进行网页爬取时,务必遵守目标网站的 `robots.txt` 文件和相关法律法规,避免频繁请求导致 IP 被封禁。 ### 6. 数据存储 爬取到的数据可以存储为文件(如 JSON、CSV)或写入数据库,以便后续处理和分析。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值