代码笔记-231218

94 阅读7分钟

[C++]

  1. ++i和i++的区别是什么?
    答:非常形象,+在前就是先+后用,+在后就是先用后+。

  2. reserve(); //预分配字符串的内存空间,预分配内存空间,可以避免在字符串追加字符时频繁重新分配内存空间的 开销,提高字符串操作的效率。预分配的空间大小取决于预估的字符串长度,如果预估不准确,可能会浪费一些内存。

  3. push_back(); //是C++中std::string类的一个成员函数,用于向字符串末尾添加一个字符。

  4. 时间复杂度和空间复杂度?
    答:

    • 时间复杂度是对算法运行时间的估计,它告诉我们随着输入规模增加,算法执行所需的时间如何改变。
      举个例子,如果一个算法的时间复杂度是 O(n),这就意味着当输入规模增加一倍时,算法所需的操作次数也会增加一倍。如果时间复杂度是 O(n^2),则当输入规模增加一倍时,算法所需的操作次数将增加四倍。
    • 空间复杂度是用来评估算法所需的内存空间随输入规模增长而变化的度量。它告诉我们算法运行时需要占用多少内存空间,随着输入规模的增加,需要占用的内存空间是如何增长的。
      以一个简单的例子来说明,如果一个算法的空间复杂度是 O(n),这表示随着输入规模的增加,算法所需的额外内存空间也会线性增加。

[C]

  1. C语言中都有哪些类型?
    答:

    • int:整数类型,用于表示整数值,如1、-5、100等。
    • char:字符类型,用于表示单个字符,如'a'、'B'、'3'等。
    • float:单精度浮点类型,用于表示小数,如3.14、-0.5等。
    • double:双精度浮点类型,用于表示更大范围的小数,如3.14159、0.123456789等。
    • void:空类型,用于表示无返回值或没有任何数据的指针。
    • _Bool:布尔类型,用于表示真或假,可以取值为0(假)或1(真)。

    除了上述基本类型,C语言还提供了以下复合类型:

    • 数组(Array):用于存储一组相同类型的元素,可以通过数组下标来访问每个元素。
    • 结构体(Structure):用于将不同类型的数据组合在一起,形成一个新的数据类型。
    • 枚举(Enum):用于定义一组命名的常量,可以表示一系列相关联的值。
    • 联合(Union):用于在同一内存地址上存储不同类型的数据,但只能同时存储其中一种类型的值。 此外,C语言还支持指针类型(Pointer),用于存储内存地址;以及派生类型(Derived Type),如函数指针、指向函数的指针等。这些类型可以根据需要在程序中进行定义和使用。
  2. 类似这种修饰符char* p、char *p怎么分辨有什么作用?
    答:在C语言中,char* pchar *p都是声明指向字符的指针的方式。它们是等价的,都表示变量p是一个指向字符(char)类型的指针。
    在C语言中,指针声明的标识符可以位于类型修饰符之前或之后,这是因为C语言中的类型修饰符(如*)是与变量名紧密绑定的。 例如,char* p的解析可以这样理解:char*表示p是一个指向字符的指针。类似地,char *p可以解析为char表示p是一个字符类型的指针。这里的关键是要记住 *是指针类型修饰符。 在使用这两种形式时,它们的作用是相同的,都用于声明指向字符的指针变量。你可以根据个人偏好选择使用哪种形式。重要的是要理解指针的本质,指针表示存储了某个变量的内存地址,而不是它修饰符的位置。 需要注意的是,如果有多个变量被声明为指针类型,例如 char* p, q;,实际上只有第一个变量p被声明为指向字符的指针,而第二个变量q只是一个字符类型的变量。为了避免混淆,可以显示地将指针声明放在每个变量名称的前面,例如:char *p, *q;,这样可以明确表达每个变量都是指针类型。

  3. 代码分析:char* res = malloc((strlen(word1) + strlen(word2) + 1) * sizeof(char));
    答:malloc函数动态分配内存,大小为(strlen(word1) + strlen(word2) + 1) * sizeof(char),即两个字符串长度之和再加1,加1的目的是为了存储字符串结尾的空字符\0

  4. 代码分析: memset(res, '\0', (strlen(word1) + strlen(word2) + 1));
    答:使用memset函数将res的内存空间全部置为\0,确保字符串的末尾是空字符。

  5. 为什么C语言中字符串需要置为\0
    答:在C语言中,字符串实际上是由字符数组表示的,以一个特殊的字符\0(也称为空字符或字符串结束符)作为结尾标记。\0表示字符串的结束,也可以看作是一个字符数组的结束标志。 这是因为C语言中没有内置的字符串类型,字符串实际上被视为以null字符结尾的字符数组。当我们使用字符数组来表示字符串时,我们需要显式地在字符数组的末尾添加一个null字符\0来标识字符串的结束位置。 这个null字符的存在非常重要,因为它允许C语言中的字符串操作函数(例如strlenstrcpystrcmp等)根据null字符来确定字符串的长度和边界。这样可以避免在处理字符串时出现缓冲区溢出或内存访问越界的问题。 例如,在一个字符数组中存储字符串"Hello",我们需要将字符数组的末尾设置为\0,即{'H', 'e', 'l', 'l', 'o', '\0'}。这样,在使用字符串时,我们可以通过找到该null字符来确定字符串的结束位置,而不是通过数组长度,因为字符串可能包含多个null字符之后的内存。 总之,将字符串末尾置为\0是C语言的约定和标准做法,它能确保字符串的正确处理和操作。


[C#]

  1. StringBuilder相比string有什么区别?
    答:
    • 使用string适合于字符串不经常变化或只进行少量修改操作的场景。每次对字符串进行修改都需要创建新的对象,导致频繁的内存分配和拷贝操作,影响性能。
    • 使用StringBuilder适合于需要频繁修改、拼接大量字符串或性能要求较高的场景。StringBuilder内部维护了一个可变的字符缓冲区,避免了频繁的内存分配和拷贝操作。

[Python]

  1. py声明变量无需写类型,例"i=j=0"

  2. py还可以这么写,"m,n=len(word1),len(word2)",m 获取word1的长度,n 获取word2的长度


[js]

  1. const、let类型什么意思?
    答:const是用于声明一个常量,即其值在声明后不能被修改。
    let是用于声明一个块级作用域的变量。块级作用域是指在代码块(例如函数、循环或花括号内的语句)中声明的变量只在该块内部可见,外部无法访问。
    而使用var声明的变量是具有函数作用域的,不会受到块级作用域的限制。
function example() {
  let x = 5;
  if (true) {
    var z = 15;
    let y = 10;
    console.log(x); // 输出 5
    console.log(y); // 输出 10
  }
  console.log(y); // 报错,y 在这里不可见
  console.log(z); // z在这里可见
}

[Golang]

  1. 代码分析:n, m := len(word1), len(word2)
    答:与py类似,不需要指定类型,赋值为':='

  2. 代码分析:ans := make([]byte, 0, n+m)
    答:创建一个空的字节切片 ans,容量初始化为 n+m,用于存储合并后的结果。