2023-10-5一些笔试题(3)

1、以下代码用基本路径法测试需要覆盖几条路径

void calculate(int i, int j){
	int a = 0;
	int b = 0;
	do {
	if(j < 0){
	a = a* b;
	}else if(j == 100) {
	a = a/j;
	}
	else if (j > 100){
	a = 0;
	} else {a = b;}
	}while (i > 0);
}

感觉下面的解释不靠谱:
对于给定的代码,我们可以使用基本路径法来计算需要覆盖的路径数。

首先,我们可以绘制控制流图以帮助我们理解代码的结构和路径:

     +---[Start]---+
     |             |
     v             |
+--->[  i > 0 ]--No-+
|    |             |
|    v             |
|  [do body]       |
|    |             |
+----[End]---------+

根据控制流图,我们可以识别以下路径:

  1. Start -> i > 0 -> do body -> End
  2. Start -> i > 0 -> do body -> End -> Start
  3. Start -> i > 0 -> End

因此,需要覆盖的路径数为 3 条。

3、以下关于临界区和互斥量描述正确的是
A、两者都可以用于同一进程中不同子线程对资原的互斥访问
B、临界区 和互斥量都可以 跨进 程使用
C.互斥量可以很好的解决由于线程 意外中止资源无法释放的问题
D.互斥量是内核对象 可以用于不同进程中子线程对资源的互斥访问

正确的描述是:

A、两者都可以用于同一进程中不同子线程对资源的互斥访问。

解释:临界区和互斥量都是用于实现线程同步的机制,用于保护共享资源,确保在同一时间只有一个线程能够访问共享资源。它们都可以在同一进程中的不同子线程之间实现互斥访问,以避免竞态条件和数据不一致的问题。

选项 B 不正确,临界区和互斥量通常是针对同一进程内的线程间使用的,而不是跨进程使用。

选项 C 不正确,互斥量无法解决线程意外中止导致资源无法释放的问题。如果一个线程在持有互斥量的情况下意外中止,那么其他线程可能会一直等待该资源的释放,导致死锁。

选项 D 不正确,互斥量是用于同一进程内的线程间互斥访问资源的机制,而不是用于不同进程中子线程对资源的互斥访问。在不同进程中,可以使用其他机制(如进程间通信)来实现跨进程的资源互斥访问。

4、查看home目录下,inode节点编号为669118的文件或目录,下面写法正确的是
在 Linux 系统中,可以使用 ls 命令来查看指定文件或目录的 inode 节点编号。下面是正确的写法:

ls -i /home | grep 669118

解释:

  • ls -i /home:这个命令会列出 /home 目录下的所有文件和目录,并显示它们的 inode 节点编号。
  • grep 669118:通过管道将 ls 命令的输出传递给 grep 命令,并使用 grep 命令来过滤出 inode 节点编号为 669118 的文件或目录。

这样,如果 inode 节点编号为 669118 的文件或目录存在于 /home 目录下,它就会被显示出来。

如果要使用 find 命令来查找 inode 节点编号为 669118 的文件或目录,可以使用以下正确的写法:

find /home -inum 669118

解释:

  • find /home:这个命令指定了要在 /home 目录下进行查找。
  • -inum 669118:这个选项指定了要查找 inode 节点编号为 669118 的文件或目录。

这样,find 命令会在 /home 目录及其子目录中查找,并输出 inode 节点编号为 669118 的文件或目录的路径。

5、以下哪个DNS记录类型用于指定域名对应的IP地址
A、CNAME
B、A
C、MX
D、AAAA
B、A

解释:
DNS记录类型 A(Address)用于指定域名对应的IPv4地址。A记录将域名映射到一个IPv4地址。

CNAME(Canonical Name)记录类型用于创建域名的别名,将一个域名指向另一个域名,并不直接指定IP地址。

MX(Mail Exchanger)记录类型用于指定邮件服务器的优先级和域名。

AAAA记录类型用于指定域名对应的IPv6地址。

因此,选项 B 中的A记录用于指定域名对应的IP地址。

6、已知商品表Product,补全这段SQL,使得能够计算出按照registDate升序进行排列的各个日期的销售单价sale_price的总额(命名为sale_price_sum)并且排序需要将registDate为NULL的记录排在第一位。
SELECT registDate, product_name, sale_price SUM(sale_price) OVER (_______) AS sale_price_sum FROM Product.

你可以使用以下 SQL 语句来计算销售单价(sale_price)的总额(sale_price_sum)并按照 registDate 升序进行排列,同时将 registDate 为 NULL 的记录排在第一位:

SELECT registDate, product_name, sale_price, 
       SUM(sale_price) OVER (ORDER BY CASE WHEN registDate IS NULL THEN 0 ELSE 1 END, registDate ASC) AS sale_price_sum
FROM Product
ORDER BY CASE WHEN registDate IS NULL THEN 0 ELSE 1 END, registDate ASC;

解释:

  • ORDER BY CASE WHEN registDate IS NULL THEN 0 ELSE 1 END, registDate ASC:这部分语句用于按照 registDate 升序进行排序,并将 registDate 为 NULL 的记录排在第一位。首先使用 CASE WHEN 判断 registDate 是否为 NULL,将其转换为 0 或 1,然后按照这个值和 registDate 进行排序。
  • SUM(sale_price) OVER (ORDER BY CASE WHEN registDate IS NULL THEN 0 ELSE 1 END, registDate ASC) AS sale_price_sum:这部分语句使用窗口函数 SUM() OVER() 计算 sale_price 的总额,并按照指定的排序方式进行累计计算。

这样,你可以得到按照 registDate 升序排列的各个日期的销售单价的总额,并将 registDate 为 NULL 的记录排在第一位,同时在结果中包含 registDate、product_name、sale_price 和 sale_price_sum。

7、执行完以下代码后,int[] X= new int[30];后,以下哪项说明是正确的
A、X[30] 为0
B、X[29]为0
C、X[29]未定义
D、X[30]为空
解释:
根据给出的代码 int[] X = new int[30];,创建了一个长度为 30 的整数数组 X。请注意,数组的索引从 0 开始,因此有效的索引范围是从 0 到 29。

现在来回答你的问题:

A. X[30] 为 0:这是不正确的。数组的索引范围是从 0 到 29,因此 X[30] 超出了有效的索引范围。访问 X[30] 将导致数组越界错误。

B. X[29] 为 0:这是正确的。由于数组索引从 0 开始,因此最后一个元素的索引是 29。在创建数组时,所有元素都会被初始化为默认值,对于整数数组来说,默认值是 0。因此,X[29] 的值为 0。

C. X[29] 未定义:这是不正确的。根据代码和上述解释,X[29] 是数组 X 的最后一个元素,并且被初始化为 0。

D. X[30] 为空:这是不正确的。X[30] 的概念不适用于整数类型的数组。数组元素的类型是整数,而不是对象,因此不存在 “为空” 的概念。

因此,正确的说明是 B,X[29] 的值为 0。

8、java中的interface有构造函数吗?它可以被实例化吗?
在 Java 中,接口(interface)是一种抽象类型,它只定义了一组方法的签名而没有具体的实现。接口本身不能有构造函数,因为它们不能被实例化。

接口在 Java 中被用作定义类的契约或协议,规定了类应该实现的方法。类可以实现一个或多个接口,并提供这些接口中定义的方法的具体实现。

虽然接口本身不能被实例化,但实现了接口的类可以被实例化。当你创建一个实现了接口的类的实例时,实际上是创建了该类的对象,而不是接口的对象。

下面是一个示例,展示了如何定义接口和实现该接口的类:

interface MyInterface {
    void myMethod();
}

class MyClass implements MyInterface {
    @Override
    public void myMethod() {
        System.out.println("Implementation of myMethod");
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj.myMethod(); // 输出 "Implementation of myMethod"
    }
}

在上述示例中,MyInterface 是一个接口,定义了一个名为 myMethod 的方法。MyClass 类实现了 MyInterface 接口,并提供了 myMethod 方法的具体实现。在 Main 类中,我们创建了 MyClass 的对象 obj,并调用了 myMethod 方法。

所以,虽然接口本身没有构造函数且不能被实例化,但实现了接口的类可以有构造函数,并且这些类的对象可以被实例化。

9、自动化测试比人工测试更能保障系统的可靠性稳定性。这句话是否正确
这句话可以说是大致正确的,但也需要注意一些细节和限制。

自动化测试在某些方面可以提供比人工测试更高的可靠性和稳定性,具有以下优势:

  1. 重复性:自动化测试可以以一致的方式重复执行相同的测试用例,确保每次测试都是相同的。这可以帮助发现潜在的稳定性问题,并提高测试的覆盖率。

  2. 高效性:自动化测试可以自动执行和验证大量的测试用例,比人工测试更快速和高效。这使得可以更频繁地运行测试,及早发现和修复问题。

  3. 可扩展性:自动化测试可以轻松扩展以适应系统的变化和新功能的添加。一旦测试脚本编写好,可以在需要时重复使用,减少了人力资源和时间的消耗。

  4. 准确性:自动化测试可以通过减少人为错误来提高测试的准确性。测试脚本可以按照预定义的步骤和预期结果执行,减少了由于人为疏忽或误操作造成的错误。

然而,也需要认识到自动化测试的一些限制和注意事项:

  1. 自动化测试无法完全替代人工测试:某些测试场景可能需要人工干预、主观判断或复杂的交互操作,这些无法完全自动化。人工测试仍然是必要的,特别是在用户体验、可用性和较复杂的测试场景方面。

  2. 维护成本:自动化测试需要投入时间和资源来编写、维护和更新测试脚本。随着系统的变化和演进,测试脚本也需要相应地进行更新和维护,否则它们可能会变得不准确或无效。

  3. 初始投资:建立自动化测试框架和编写测试脚本需要一定的初始投资,包括技术设施、培训和专业知识。这可能需要额外的资源和成本。

  4. 非功能性测试的限制:对于某些非功能性测试(如可视化、人机交互等),自动化测试的效果可能有限。这些测试可能需要人工参与和主观评估。

综上所述,自动化测试可以提供更高的可靠性和稳定性,但仍然需要结合人工测试来获得全面的测试覆盖和最佳的测试结果。

10、selenium,testNg都是自动化的测试框架
是的,Selenium和TestNG都是流行的自动化测试框架。

Selenium是一个用于Web应用程序测试的开源框架。它提供了一组API和工具,可以用于模拟用户与Web应用程序的交互,执行各种操作(如点击、填写表单、提交等),并验证应用程序的行为和结果。Selenium支持多种编程语言,包括Java、Python、C#等。

TestNG是一个基于Java的测试框架,提供了更灵活和强大的测试功能。它支持测试用例的分组、依赖关系、并行执行、配置灵活等特性。TestNG可以与各种测试工具和框架集成,包括Selenium,用于编写和执行自动化测试脚本。

结合Selenium和TestNG,可以实现强大的自动化测试。Selenium用于模拟用户与Web应用程序的交互,而TestNG提供了更高级的测试管理和执行功能。通过编写TestNG测试脚本,可以利用Selenium执行各种Web应用程序的自动化测试,并使用TestNG的丰富功能进行测试管理和报告生成。

需要注意的是,Selenium和TestNG仅仅是自动化测试中的两个流行框架,还有其他许多工具和框架可用于自动化测试,具体选择取决于项目需求和偏好。

11、将关键字,50,15,20,25,30,35,40,45依次加入到初始化为空的小根堆中,得到的h是()
小根堆是一种二叉堆,其中每个节点的值都小于或等于其子节点的值。根据给定的关键字序列 [50, 15, 20, 25, 30, 35, 40, 45],我们可以按照以下步骤将它们插入到一个初始为空的小根堆中:

  1. 创建一个空的小根堆 h
  2. 依次将关键字插入小根堆:
    • 插入 50:堆为空,直接插入。
    • 插入 15:15 小于 50,将其插入到堆中。
    • 插入 20:20 小于 15,但是它应该是 50 的子节点,因此将其与 15 交换位置,然后插入到堆中。
    • 插入 25:25 小于 15,但是它应该是 50 的子节点,因此将其与 15 交换位置,然后插入到堆中。
    • 插入 30:30 小于 15,但是它应该是 50 的子节点,因此将其与 15 交换位置,然后插入到堆中。
    • 插入 35:35 小于 15,但是它应该是 50 的子节点,因此将其与 15 交换位置,然后插入到堆中。
    • 插入 40:40 小于 15,但是它应该是 50 的子节点,因此将其与 15 交换位置,然后插入到堆中。
    • 插入 45:45 小于 15,但是它应该是 50 的子节点,因此将其与 15 交换位置,然后插入到堆中。

最终,得到的小根堆 h 的顺序为 [15, 20, 25, 30, 35, 40, 45, 50]

请注意,小根堆的性质是每个节点的值都小于或等于其子节点的值,并且堆中的元素并不一定按照从小到大的顺序排列。以上的插入过程是按照小根堆的性质进行的。

12、下列不属于索引类型的是
a、哈希索引
b、行列索引
c、r-tree索引
d、b-tree索引

不属于索引类型的是 “b、行列索引”。

哈希索引(Hash Index)、R-Tree索引和B-Tree索引都是常见的索引类型,用于在数据库中加快数据的检索速度。

  • 哈希索引使用哈希函数将索引键映射为哈希值,然后将哈希值与实际数据的存储位置关联起来。它适用于等值查询,但不适用于范围查询。
  • R-Tree索引是一种用于空间数据的索引结构,用于加速空间范围查询,例如地理位置数据。
  • B-Tree索引是一种平衡树结构,用于支持范围查询和等值查询。它是大多数关系数据库系统中常见的索引类型。

而"行列索引"并不是一个常见的索引类型。通常,数据库中的索引是基于列的,用于加速对特定列或列组合的查询。索引的目的是提高查询性能,减少数据的扫描和比较操作,而"行列索引"这个术语并没有明确的定义或常见的应用场景。

13、以下哪个字段用于标识IPV4数据报的唯一性
a、ip标识符
b、序列号
c、端口号
d、ip地址

解释:
a、ip标识符是用于标识IPv4数据报的唯一性的字段。

IPv4数据报中的"ip标识符"字段是一个16位的字段,用于在网络中唯一标识一个数据报。当一个数据报被分片传输时,所有的分片都会使用相同的ip标识符。接收端可以使用ip标识符来将分片重新组装成完整的数据报。

序列号字段(b)通常用于传输层协议(如TCP)中,用于保证数据的可靠传输和顺序性,而不是用于标识IPv4数据报的唯一性。

端口号字段(c)用于标识传输层协议中的应用程序或服务。它在传输层上唯一标识一个应用程序或服务,而不是标识IPv4数据报的唯一性。

IP地址(d)用于标识网络中的主机或设备,它是唯一的,但不是用于标识IPv4数据报的唯一性。同一IP地址可以在不同的IPv4数据报中出现。

14、主机a与b之间建立TCP连接,主机a向b发送数据报段大小为2 kb,主机b的接收窗口大小为18 KB。如果采用慢开始控制拥塞,发送第一个完全窗口要多久?

解释:在慢开始控制拥塞算法中,发送方在建立连接时会以较小的拥塞窗口(cwnd)开始发送数据,然后逐渐增大拥塞窗口的大小,直到达到接收方的窗口大小。

给定主机a发送的数据报段大小为2 KB(2048字节)和主机b的接收窗口大小为18 KB(18432字节),我们可以计算发送第一个完全窗口所需的时间。

首先,将接收窗口大小转换为数据报段的数量:
18 KB = 18 * 1024 字节 = 18432 字节
每个数据报段大小为 2 KB = 2048 字节
因此,接收窗口大小为 18432 字节 / 2048 字节 = 9 个数据报段。

在慢开始控制拥塞算法中,发送方初始的拥塞窗口大小(cwnd)通常为1个数据报段大小,即2 KB。

发送第一个完全窗口需要发送 9 个数据报段,而每个数据报段发送的时间取决于网络传输速率和往返时延(RTT)。假设每个数据报段需要一个RTT的时间传输到接收方并收到确认。

因此,发送第一个完全窗口所需的时间为 9 * RTT。

需要注意的是,实际的传输时间还取决于网络延迟、拥塞情况以及其他网络因素,上述计算仅提供了一个理论估计。

15、在linux中下面哪个选项可能是一个扇区存储的字节数
a、256
b、1024
c、512
d、64

解释:在Linux中,扇区大小通常是以字节为单位表示的。常见的扇区大小是512字节。

因此,选项c、512很可能是一个扇区存储的字节数。

选项a、256,选项b、1024和选项d、64不是常见的扇区大小,因此不太可能是扇区存储的字节数。

16、下列所述传输层协议级别中,不具备多路复用的是
A、级别0和3
b、级别二和级别3
c、级别一和级别2
d、级别零和级别一

解释:传输层协议具备多路复用的特性,它可以同时支持多个应用程序或进程通过同一个传输层连接进行通信。因此,选项中不具备多路复用的组合是:

d、级别零和级别一。

传输层协议级别零(Level 0)和级别一(Level 1)都不具备多路复用的特性。级别零通常指的是物理层或数据链路层,而级别一可能指的是网络层。这些级别通常不涉及传输层协议,因此不具备多路复用的能力。

另外,选项a、级别0和3、b、级别二和级别3、c、级别一和级别2都包含了具备多路复用特性的传输层协议级别。

17、学校打印店打印系统中一个进程,释放了一个扫描仪则下列选项中()可能会发生状态改变
a、所有等待扫描仪的进程
b、另一个等待扫描仪的进程
c、自身进程
d、输入输出进程

根据问题描述,假设一个进程释放了一个扫描仪。在这种情况下,可能会发生状态改变的选项是:

b、另一个等待扫描仪的进程

当一个进程释放了一个扫描仪时,如果有其他进程在等待获取扫描仪资源,那么其中一个等待扫描仪的进程有可能会发生状态改变,因为它现在有机会获得该资源并开始执行扫描任务。

其他选项的情况如下:
a、所有等待扫描仪的进程:由于释放的只是一个扫描仪,而不是所有扫描仪,因此不是所有等待扫描仪的进程都会发生状态改变。
c、自身进程:进程自身已经释放了扫描仪,因此它的状态不会改变。
d、输入输出进程:问题描述中没有提到与输入输出进程相关的信息,因此无法判断它是否会发生状态改变。

因此,选项 b、另一个等待扫描仪的进程是可能会发生状态改变的。

18、判断对错
1、类变量不能在类的方法中声明。
2、静态成员是类的成员。
3、在创建对象前,静态成员不存在

判断对错:

1、错误。类变量可以在类的方法中声明。类变量是指被所有类的实例对象所共享的变量,在类的任何方法中都可以使用和修改类变量的值。

2、正确。静态成员是类的成员,它们属于类本身而不是类的实例对象。静态成员在类加载时被初始化,它们不依赖于类的实例。

3、错误。在创建对象之前,静态成员已经存在并且可以被访问。静态成员在类加载时就被初始化,不需要创建对象就可以直接访问和使用静态成员。

19、动态查找表一边查找一边改变集合中的元素,改变的方式可以是
a、删除
b、增加
c、交换
d、移动

动态查找表一边查找一边改变集合中的元素时,可以进行以下改变方式:

a、删除:在查找过程中,如果发现某个元素不符合要求或不需要,可以将其从集合中删除。

b、增加:在查找过程中,如果需要添加新的元素到集合中,可以进行增加操作。

c、交换:在查找过程中,可以对集合中的元素进行交换操作,改变它们的位置。

d、移动:在查找过程中,可以将元素从一个位置移动到另一个位置,改变它们在集合中的顺序。

综上所述,以上选项 a、删除;b、增加;c、交换;d、移动都是改变集合中元素的方式。

20、在C++中使用C函数时,以下说法是正确的:

A、C++可以对C函数进行重载:C++支持函数的重载,包括C函数。可以在C++中定义具有相同名称但参数列表不同的函数,以实现函数的重载。

B、可以将C++的成员函数使用extern "C"导出,在C中进行调用:通过使用extern "C"修饰符,可以将C++的成员函数导出为C函数,使得在C中可以调用这些函数。

C、新声明的C函数不能与C++函数重名:如果在C++中已经定义了一个函数,并且在C中使用extern "C"导出,那么在C中不能再声明一个具有相同名称的函数,以避免重名冲突。

D、可以将一个C函数指针赋值给一个C++函数变量:C++允许将C函数指针赋值给一个函数变量,以便在C++中调用C函数。

综上所述,选项A、C++可以对C函数进行重载;B、可以将C++的成员函数使用extern "C"导出,在C中进行调用;D、可以将一个C函数指针赋值给一个C++函数变量,都是正确的说法。

21、

#include
#include
using namespace std;
int main(void) {
    string s("abc");
    string n("Abde");
    cout << s.compare(n) << endl;
    cout <<s.compare(1,2,n,1,2) << endl;
    cout << s.compare(1,2,n,1,3) << endl;
}

根据给定的代码,以下是输出结果的解释:

string s("abc");
string n("Abde");
cout << s.compare(n) << endl;           // 输出结果:-1
cout << s.compare(1, 2, n, 1, 2) << endl; // 输出结果:0
cout << s.compare(1, 2, n, 1, 3) << endl; // 输出结果:1

解释:

  1. s.compare(n):比较字符串 sn 的字典序。由于 “abc” 在字典序上小于 “Abde”,所以返回值为负数。因此,输出结果为 -1

  2. s.compare(1, 2, n, 1, 2):比较字符串 s 的子串(从索引 1 开始,长度为 2)和字符串 n 的子串(从索引 1 开始,长度为 2)。子串 “bc” 在字典序上等于子串 “bd”,所以返回值为 0。因此,输出结果为 0

  3. s.compare(1, 2, n, 1, 3):比较字符串 s 的子串(从索引 1 开始,长度为 2)和字符串 n 的子串(从索引 1 开始,长度为 3)。子串 “bc” 在字典序上小于子串 “bde”,所以返回值为正数。因此,输出结果为 1

总结:输出结果为 -101。这些结果表示两个字符串或子串之间的字典序关系。

22、小红有一个排列a:a1,a2,a3,…,an,但她不记得这个排列,只记得排列满足aai=n-i+1,并且排列长度为n,请你帮助小红还原这个排列,排列是指一个长度为length的数组,数组中包含1到length的个数,且每个数只出现一次。
输入:4
输出:2 4 1 3

23、下列哪些是测试用例的设计技术
a边界值分析
b等价类划分
c回归测试
d正交实验

解释:a、边界值分析和b、等价类划分是测试用例设计技术,而c、回归测试和d、正交实验不是测试用例设计技术。

a、边界值分析(Boundary Value Analysis):该技术通过选择输入值的边界情况来设计测试用例,因为边界值通常是导致错误的常见场景。它包括选择最小边界、最大边界和边界之间的值作为测试输入。

b、等价类划分(Equivalence Partitioning):该技术将输入域划分为不同的等价类,以确保测试用例能够覆盖每个等价类中的典型情况。在每个等价类中,测试用例的行为应该是相同的,因此只需选择一个代表性的测试用例来覆盖该等价类。

c、回归测试(Regression Testing):回归测试是在对软件进行修改或添加新功能后,重新执行以前的测试用例,以确保已修改的软件部分与之前的版本相比没有引入新的错误或导致功能退化。

d、正交实验(Orthogonal Testing):正交实验技术通过选择一组经过精心设计的测试用例,以最小的测试用例数量覆盖尽可能多的功能组合,从而有效地进行测试。它通过将测试用例设计为正交数组,以覆盖不同的功能组合和参数配置。

综上所述,a、边界值分析和b、等价类划分是测试用例设计技术,而c、回归测试和d、正交实验是其他测试技术或方法。

24、Cat-n file1 file2命令的意思是
cat 命令是一个用于连接文件并打印到标准输出的命令,而 -ncat 命令的一个选项,用于在输出中显示行号。

因此,cat -n file1 file2 命令的意思是将 file1file2 中的内容连接起来,并在输出中显示行号。命令执行后,file1 的内容会首先显示,每一行前面会有行号;接着是 file2 的内容,同样每一行前面会有行号。输出的顺序与文件参数的顺序相同。

例如,假设 file1 包含以下内容:

Hello
World

file2 包含以下内容:

Welcome
to
the
World

执行 cat -n file1 file2 命令后,输出将会是:

     1  Hello
     2  World
     3  Welcome
     4  to
     5  the
     6  World

每一行前面的数字表示行号,然后是对应的行内容。

25、shell命令中查看当前目录的所有文件和文件夹的大小的命令是
在Shell中,可以使用 du 命令来查看当前目录下所有文件和文件夹的大小。du(磁盘使用)命令用于估算文件和目录的磁盘使用情况。

要查看当前目录下所有文件和文件夹的大小,可以使用以下命令:

du -sh *

解释:

  • du:磁盘使用命令。
  • -s:仅显示总结信息,而不显示详细信息。
  • -h:以人类可读的格式显示文件和目录的大小。
  • *:通配符,代表当前目录下的所有文件和文件夹。

执行以上命令后,将会显示类似以下的输出:

4.0K    file1.txt
8.0K    folder1
20K     folder2

每一行的开头表示该文件或文件夹的大小,以人类可读的格式显示,后面是文件或文件夹的名称。文件大小以千字节(K)为单位,文件夹大小表示其包含的所有文件和子文件夹的总大小。

如果你只想查看当前目录下的文件夹的大小,可以使用以下命令:

du -sh */

这将只显示文件夹的大小,而不包括文件的大小。

26、下面排序算法在输入数据逆序情况下,排序最快
a归并排序
b直接插入排序
c冒泡排序
d简单选择排序

在输入数据逆序情况下,归并排序(Merge Sort)是最快的排序算法,因为归并排序的时间复杂度在最坏情况下也是 O(n log n)。

归并排序的基本思想是将待排序的序列分成两个子序列,分别进行排序,然后将两个已排序的子序列合并成一个有序的序列。在逆序情况下,归并排序能够充分利用其分治和合并的特点,将逆序序列迅速拆分为多个子序列,并通过合并操作将它们按照正确的顺序重新组合,从而实现高效的排序。

相比之下,直接插入排序(Insertion Sort)、冒泡排序(Bubble Sort)和简单选择排序(Selection Sort)在逆序情况下的性能较差。

  • 直接插入排序的时间复杂度为 O(n^2),在逆序情况下需要频繁地进行元素的移动操作,导致效率较低。
  • 冒泡排序的时间复杂度也为 O(n^2),在逆序情况下需要进行多次的元素交换操作,效率较低。
  • 简单选择排序的时间复杂度同样为 O(n^2),在逆序情况下也需要进行多次的元素交换操作,效率较低。

因此,归并排序是在输入数据逆序情况下最快的排序算法。

你可能感兴趣的:(秋招笔试)