某c++公司的面试笔试题分享

news/2025/2/27 0:03:54

2、若有定义:int a[3][4];不能表示数组元素a[1][1]的是     。
(A)*(a[1]+1)      (B)*(&a[1][1])    (C)(*(a+1))[1]      (D)*(a+5)
在C语言中,数组 a[3][4] 是一个二维数组,可以看作是3行4列的矩阵。数组元素 a[1][1] 表示第二行第二列的元素。
我们来分析每个选项:
(A)*(a[1]+1)
a[1] 是第二行的首地址,a[1]+1 是第二行第二个元素的地址,*(a[1]+1) 就是 a[1][1]。所以这个选项可以表示 a[1][1]。

(B)*(&a[1][1])
&a[1][1] 是 a[1][1] 的地址,*(&a[1][1]) 就是 a[1][1] 本身。所以这个选项也可以表示 a[1][1]。

(C)(*(a+1))[1]
a+1 是第二行的首地址,*(a+1) 是第二行的首元素,(*(a+1))[1] 就是第二行第二个元素,即 a[1][1]。所以这个选项也可以表示 a[1][1]。

(D)*(a+5)
a 是整个数组的首地址,a+5 是跳过5行的地址(每行有4个元素),所以 *(a+5) 实际上是访问了数组的第6行的首元素,这已经超出了数组 a[3][4] 的范围。因此,这个选项不能正确表示 a[1][1]。

3、以下哪一关键字可用于重载函数的区分     。
(A)extern
(B)static 
(C)const 
(D)virtual

在C++中,函数重载(Function Overloading)是通过函数的参数列表(参数的类型、数量或顺序)来区分的,而不是通过关键字。因此,题目中的选项 (A)extern、(B)static、(C)const 和 (D)virtual 都不能直接用于函数重载的区分。

不过,如果题目问的是哪些关键字可以影响函数的行为或特性,从而间接影响函数重载的区分,那么可以分析如下:

(A)extern
extern 用于声明外部链接,通常用于全局变量或函数的声明,与函数重载无关。

(B)static
static 可以用于函数或变量,表示静态存储期或内部链接。对于成员函数,static 表示静态成员函数,但它不参与函数重载的区分。

(C)const
const 可以用于成员函数,表示该函数不会修改对象的状态。const 成员函数和非 const 成员函数可以构成重载,因为它们的 this 指针类型不同(const 和 非 const)。因此,const 可以用于区分重载函数。

(D)virtual
virtual 用于声明虚函数,支持多态行为,但它与函数重载无关。

正确答案
如果题目问的是哪些关键字可以用于函数重载的区分,那么 (C)const 是正确的选项,因为 const 成员函数和非 const 成员函数可以构成重载。

最终答案:C

4、下列有关继承和派生的叙述中,正确的是     。
(A)派生类不能访问通过私有继承的基类的保护成员
(B)多继承的虚基类不能够实例化
(C)如果基类没有默认构造函数,派生类构造函数必须显式地调用基类的带参构造函数
(D)基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现

A)派生类不能访问通过私有继承的基类的保护成员
分析:
在私有继承(private)中,基类的 public 和 protected 成员在派生类中都变为 private 成员。派生类内部可以访问基类的 protected 成员,但不能通过派生类对象访问这些成员。

结论:
该选项描述不准确。派生类内部可以访问基类的 protected 成员,只是外部无法通过派生类对象访问。

(B)多继承的虚基类不能够实例化
分析:
虚基类(virtual base class)是为了解决多继承中的菱形继承问题而引入的。虚基类本身是可以实例化的,除非它是一个抽象类(包含纯虚函数)。

结论:
该选项错误。虚基类可以实例化,除非它是抽象类。

(C)如果基类没有默认构造函数,派生类构造函数必须显式地调用基类的带参构造函数
分析:
如果基类没有默认构造函数(即基类只有带参数的构造函数),派生类的构造函数必须显式调用基类的带参构造函数,否则编译器会报错。

结论:
该选项正确。

(D)基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现
分析:

析构函数不能被继承,但派生类可以调用基类的析构函数。

虚函数可以被继承,派生类可以选择重写(override)基类的虚函数,但不是必须的。如果派生类不重写虚函数,则使用基类的实现。

结论:
该选项错误。虚函数可以被继承,且不需要在派生类中重新实现。

正确答案
选项 (C) 是正确的。

5、下面程序的输出结果是     。
#include <iostream.h>
using namespace std;
void swap1(int &v1, int &v2)
{
int tmp = v2; v2 = v1; v1 = tmp;
}
void swap1(int *v1, int *v2)
{
int tmp = *v2; *v2 = *v1; *v1 = tmp;
}
void main()
{
int i = 10, j = 20; 
swap1(i, j);
swap1(&i, &j);
cout << i << ”,” << j << endl;
}
我们来逐步分析这段代码的执行过程,以确定最终的输出结果。

代码分析
函数定义:

void swap1(int &v1, int &v2):这是一个通过引用交换两个整数的函数。

void swap1(int *v1, int *v2):这是一个通过指针交换两个整数的函数。

main函数中的操作:

定义两个整数 i = 10 和 j = 20。

第一次调用 swap1(i, j):调用的是引用版本的 swap1,交换后 i = 20,j = 10。

第二次调用 swap1(&i, &j):调用的是指针版本的 swap1,交换后 i = 10,j = 20。

最后输出 i 和 j 的值。

执行过程:

初始值:i = 10,j = 20。

第一次交换后:i = 20,j = 10。

第二次交换后:i = 10,j = 20。

最终输出:10,20。

代码中的问题
头文件问题:

#include <iostream.h> 是旧的标准,现代C++应使用 #include <iostream>。

void main() 不符合C++标准,应改为 int main()。

输出语句问题:

cout << i << ”,” << j << endl; 中的引号是中文引号(”),应改为英文引号(")。

修正后的代码
cpp
复制
#include <iostream>
using namespace std;

void swap1(int &v1, int &v2)
{
    int tmp = v2; v2 = v1; v1 = tmp;
}

void swap1(int *v1, int *v2)
{
    int tmp = *v2; *v2 = *v1; *v1 = tmp;
}

int main()
{
    int i = 10, j = 20;
    swap1(i, j);    // 交换后:i = 20, j = 10
    swap1(&i, &j);  // 交换后:i = 10, j = 20
    cout << i << "," << j << endl;
    return 0;
}
输出结果
最终输出为:10,20。

6、用某种排序方法对关键字序列{56, 23, 78, 12, 45, 67, 89, 34, 9, 100}进行排序时,序列的变化情况如下:
12,9,23,34,45,56,89,67,78,100
9,12,23,34,45,56,89,67,78,100
9,12,23,34,45,56,67,78,89,100
则采用的方法是     。
(A)直接选择排序      
(B)希尔排序              
(C)堆排序                
(D)快速排序
根据题目描述,排序过程中序列的变化情况如下:

初始序列:56, 23, 78, 12, 45, 67, 89, 34, 9, 100

第一次变化:12, 9, 23, 34, 45, 56, 89, 67, 78, 100

第二次变化:9, 12, 23, 34, 45, 56, 89, 67, 78, 100

第三次变化:9, 12, 23, 34, 45, 56, 67, 78, 89, 100

分析排序方法
直接选择排序(A):

每次从剩余未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。

特点:每次只能确定一个元素的位置,排序过程较慢。

与题目中的变化不符,题目中每次变化涉及多个元素的移动。

希尔排序(B):

是插入排序的改进版本,通过分组进行插入排序,逐步缩小分组间隔。

特点:排序过程中元素是跳跃式移动的。

与题目中的变化不符,题目中没有明显的分组特征。

堆排序(C):

通过构建堆(大顶堆或小顶堆)来实现排序,每次将堆顶元素与末尾元素交换,然后调整堆。

特点:排序过程中元素是跳跃式移动的,且每次只能确定一个元素的位置。

与题目中的变化不符。

快速排序(D):

通过选择一个基准元素,将序列分为两部分,左边部分小于基准,右边部分大于基准,然后递归排序。

特点:每次变化可能涉及多个元素的移动,且排序过程中序列逐渐趋于有序。

与题目中的变化高度吻合。

结论
从序列的变化情况来看,每次变化都涉及多个元素的移动,且序列逐渐趋于有序,符合快速排序的特点。

正确答案:D

8、C++ 基类中的 private 成员通过     类型的继承,可以被派生类访问。
(A)public
(B)protected
(C)private
(D)任何类型的继承都不能使得派生类可以访问基类的private成员
在C++中,基类的 private 成员在任何情况下都不能被派生类直接访问,无论继承方式是什么(public、protected 或 private)。private 成员的访问权限仅限于定义它们的类内部。

继承方式的影响
继承方式(public、protected、private)只会影响基类的 public 和 protected 成员在派生类中的访问权限,而不会影响 private 成员的访问权限。

public 继承:

基类的 public 成员在派生类中仍然是 public。

基类的 protected 成员在派生类中仍然是 protected。

protected 继承:

基类的 public 和 protected 成员在派生类中都变为 protected。

private 继承:

基类的 public 和 protected 成员在派生类中都变为 private。

结论
无论继承方式是什么,基类的 private 成员都不能被派生类访问。因此,正确答案是:

(D)任何类型的继承都不能使得派生类可以访问基类的private成员

9、如果基类 A 和 A 的派生类 B 中都有成员函数 func();要在派生类的 func()中调用同名的基类的 func()成员函数,下列     操作是正确的。 
(A)func(); 
(B)A::func(); 
(C)B::func(); 
(D)A.func();
在C++中,如果基类 A 和派生类 B 中都有同名的成员函数 func(),在派生类的 func() 中调用基类的 func(),需要使用作用域解析运算符 :: 来显式指定调用的是基类的函数。

分析选项
(A)func();
这种调用方式会直接调用派生类 B 的 func(),导致递归调用,无法调用基类 A 的 func()。

(B)A::func();
使用作用域解析运算符 ::,显式调用基类 A 的 func(),这是正确的调用方式。

(C)B::func();
这种调用方式会调用派生类 B 的 func(),导致递归调用,无法调用基类 A 的 func()。

(D)A.func();
这种语法是错误的,因为 A 是类名,而不是对象名。不能通过类名直接调用成员函数。

示例代码
cpp
复制
#include <iostream>
using namespace std;

class A {
public:
    void func() {
        cout << "A::func()" << endl;
    }
};

class B : public A {
public:
    void func() {
        cout << "B::func()" << endl;
        A::func();  // 正确调用基类的 func()
    }
};

int main() {
    B b;
    b.func();
    return 0;
}
输出结果:

复制
B::func()
A::func()
结论
正确的操作是使用 A::func();,即选项 (B)。

正确答案:B

10、下面对静态数据成员的描述中,正确的是     。
(A)静态数据成员是类的所有对象共享的数据
(B)类的每个对象都有自己的静态数据成员
(C)类的不同对象有不同的静态数据成员值
(D)静态数据成员不能通过类的对象调用
(A)静态数据成员是类的所有对象共享的数据

解析:
静态数据成员是类的所有对象共享的数据,它们在类的所有实例中只有一个副本。这意味着无论创建多少个类的对象,静态数据成员都只有一个实例。因此,选项A是正确的。

选项B和C是错误的,因为静态数据成员不是每个对象独有的,而是所有对象共享的。

选项D也是错误的,静态数据成员可以通过类的对象调用,也可以通过类名直接调用。

11、下列代码的输出内容是 C    。
#include<stdio.h>
main()
{
int a, b, c, d;
a = 10;
b = a++;
c = ++a;
d = 10*a++;
printf("%d,%d,%d",b,c,d);
return 0;
}
(A)13,12,120   (B)10,11,120  (C)10,12,120   (D)10,12,130
让我们逐步分析代码的执行过程:

变量初始化:

a = 10

b = a++:

a++ 是后置递增操作,先使用 a 的当前值,然后再递增。

因此,b = 10,然后 a 递增为 11。

c = ++a:

++a 是前置递增操作,先递增 a,然后再使用 a 的值。

a 从 11 递增为 12,然后 c = 12。

d = 10 * a++:

a++ 是后置递增操作,先使用 a 的当前值,然后再递增。

a 的当前值是 12,所以 d = 10 * 12 = 120,然后 a 递增为 13。

输出:

printf("%d,%d,%d", b, c, d) 输出 b、c、d 的值。

b = 10,c = 12,d = 120。

因此,代码的输出内容是:
10,12,120

正确答案是:
(C)10,12,120

在 C++ 中,函数调用的参数传递方式有以下几种:

传值(Pass by Value):

形参是实参的副本,对形参的修改不会影响实参。

选项 C 的说法是错误的,因为传值后对形参的修改不会改变实参的值。

传地址(Pass by Pointer):

形参是指向实参地址的指针,实参和形参指向同一个对象。

选项 A 的说法是错误的,因为传地址后实参和形参指向同一个对象。

传引用(Pass by Reference):

形参是实参的别名,实参和形参是同一个对象。

选项 B 的说法是错误的,因为传引用后实参和形参是同一个对象。

其他三项都不对:

由于选项 A、B、C 的说法都是错误的,因此选项 D 是正确的。

正确答案:
(D)其他三项都不对

1、下列中a的值是       。
#define AAA 200
#define BBB AAA+100
int a = BBB*2
让我们逐步分析代码的执行过程:

宏定义:

#define AAA 200:将 AAA 定义为 200。

#define BBB AAA + 100:将 BBB 定义为 AAA + 100,即 200 + 100,也就是 300。

变量初始化:

int a = BBB * 2:将 BBB 替换为 AAA + 100,即 200 + 100,然后计算 a = 300 * 2。

计算:

a = 300 * 2,因此 a = 600。

注意:

宏定义是直接替换文本,不会考虑运算符优先级。因此,BBB * 2 实际上是 AAA + 100 * 2,即 200 + 200 = 400。

如果希望 BBB 的计算结果优先于乘法运算,应该使用括号明确优先级:

cpp
复制
#define BBB (AAA + 100)
这样 BBB * 2 就是 (200 + 100) * 2 = 600。

根据题目中的定义:

a = 200 + 100 * 2 = 200 + 200 = 400。

最终答案:
a 的值是 400

2、使用        的方法可以实现编译时多态,使用       的可以实现运行时多态。
在 C++ 中,多态性可以通过两种方式实现:

编译时多态:

编译时多态是通过函数重载和模板实现的。

函数重载允许在同一作用域内定义多个同名函数,但参数列表不同。

模板允许编写通用的代码,编译器会根据具体类型生成相应的函数或类。

运行时多态:

运行时多态是通过虚函数和继承实现的。

虚函数允许在基类中声明一个函数,并在派生类中重写该函数。通过基类指针或引用调用虚函数时,实际调用的是派生类的函数。

填空题答案:

使用 函数重载和模板 的方法可以实现编译时多态。

使用 虚函数和继承 的方法可以实现运行时多态。

完整答案:
使用 函数重载和模板 的方法可以实现编译时多态,使用 虚函数和继承 的方法可以实现运行时多态。


3、程序的局部变量存在于          中,全局变量存在于          中,动态申请数据存在于          中。
在程序的内存布局中,变量和数据存储在不同的内存区域:

局部变量:

局部变量存在于 栈(Stack) 中。

栈是由编译器自动分配和释放的内存区域,用于存储函数调用时的局部变量、函数参数和返回地址等。

全局变量:

全局变量存在于 全局/静态存储区(Global/Static Storage Area) 中。

全局变量和静态变量在程序编译时分配内存,并在程序运行期间一直存在。

动态申请的数据:

动态申请的数据存在于 堆(Heap) 中。

堆是由程序员手动分配和释放的内存区域,通过 malloc、new 等函数动态申请内存。

填空题答案:

程序的局部变量存在于 栈 中。

全局变量存在于 全局/静态存储区 中。

动态申请数据存在于 堆 中。

完整答案:
程序的局部变量存在于 栈 中,全局变量存在于 全局/静态存储区 中,动态申请数据存在于 堆 中。


1、用变量a给出下面的定义
(A)一个指向整型数的指针
(B)一个有10个指针的数组,该指针是指向一个整型数
(C)一个指向有10个整型数组的指针
(D)一个指向函数的指针,该函数有一个整型参数并返回一个整型数
(E)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
以下是变量 a 的定义,分别对应题目中的各个要求:

(A)一个指向整型数的指针
c
复制
int *a;
a 是一个指针,指向一个整型数。

(B)一个有10个指针的数组,该指针是指向一个整型数
c
复制
int *a[10];
a 是一个数组,包含 10 个元素,每个元素是一个指向整型数的指针。

(C)一个指向有10个整型数组的指针
c
复制
int (*a)[10];
a 是一个指针,指向一个包含 10 个整型数的数组。

(D)一个指向函数的指针,该函数有一个整型参数并返回一个整型数
c
复制
int (*a)(int);
a 是一个指针,指向一个函数,该函数接受一个整型参数并返回一个整型数。

(E)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
c
复制
int (*a[10])(int);
a 是一个数组,包含 10 个元素,每个元素是一个指向函数的指针,该函数接受一个整型参数并返回一个整型数。

总结
(A)int *a;

(B)int *a[10];

(C)int (*a)[10];

(D)int (*a)(int);

(E)int (*a[10])(int);


2、Dll导出函数中使用stl参数会有什么问题?Dll内存分配和释放有什么需要注意的点?MT和MD混合使用会有什么问题?DllMain函数中添加代码有什么需要注意的问题?
以下是关于 DLL 开发中常见问题的详细解答:

1. DLL 导出函数中使用 STL 参数会有什么问题?
在 DLL 导出函数中使用 STL(标准模板库)参数可能会导致以下问题:

内存管理问题:

STL 容器(如 std::string、std::vector 等)在动态库和调用方之间传递时,如果双方使用不同的运行时库(如 MT 和 MD),可能导致内存分配和释放不一致,引发崩溃。

ABI 兼容性问题:

STL 的实现可能因编译器版本或设置不同而不同,导致二进制接口不兼容。

解决方案:

避免直接传递 STL 对象,改用原始数据类型(如 char*、int* 等)或自定义数据结构。

如果必须使用 STL,确保 DLL 和调用方使用相同的编译器版本和运行时库。

2. DLL 内存分配和释放有什么需要注意的点?
在 DLL 中分配和释放内存时需要注意:

内存分配和释放的一致性:

内存必须在同一个模块(DLL 或 EXE)中分配和释放。如果 DLL 分配内存,调用方释放(或反之),可能导致崩溃。

使用统一的运行时库:

确保 DLL 和调用方使用相同的运行时库(如 MT 或 MD),否则可能导致内存管理不一致。

解决方案:

提供分配和释放内存的接口函数,确保内存管理在同一模块中完成。

使用共享内存或智能指针(如 std::shared_ptr)来管理跨模块的内存。

3. MT 和 MD 混合使用会有什么问题?
MT(静态链接运行时库)和 MD(动态链接运行时库)混合使用会导致以下问题:

运行时库冲突:

MT 和 MD 使用不同的内存管理机制,混合使用可能导致内存分配和释放不一致,引发崩溃。

全局状态不一致:

运行时库的全局状态(如 errno、std::cout 等)在 MT 和 MD 之间不共享,可能导致未定义行为。

解决方案:

确保 DLL 和调用方使用相同的运行时库(MT 或 MD)。

在项目设置中统一配置运行时库。

4. DllMain 函数中添加代码有什么需要注意的问题?
在 DllMain 函数中添加代码时需要注意:

避免复杂操作:

DllMain 在 DLL 加载和卸载时调用,此时系统处于临界状态,不适合执行复杂操作(如创建线程、加载其他 DLL、调用同步对象等)。

避免死锁:

在 DllMain 中调用可能导致锁定的函数(如 LoadLibrary、FreeLibrary 等)可能引发死锁。

解决方案:

在 DllMain 中只执行简单的初始化或清理操作。

将复杂操作移到单独的初始化函数中,由调用方显式调用。

总结
STL 参数问题:避免直接传递 STL 对象,确保 ABI 兼容性。

内存管理问题:确保内存分配和释放在同一模块中完成。

MT 和 MD 混合问题:统一使用 MT 或 MD,避免运行时库冲突。

DllMain 注意事项:避免复杂操作和死锁,保持代码简单。

通过遵循这些原则,可以避免 DLL 开发中的常见问题。

3、一块N个字节的内存,它的首地址(头指针)为pStart,那么末地址为
pStart+(N-1)*4

4、计算下面结构体的大小,标注每个结构体成员的大小
typedef struct _a 

     char c1;
     long i; 
     char c2;
     double f; 
}a; 
typedef struct _b 

    char c1;
    char c2; 
    long i; 
    double f; 
}b; 
注:必须写出每个成员大小
在计算结构体大小时,需要考虑 内存对齐 的规则。以下是常见的内存对齐规则(以 64 位系统为例):

char:1 字节

long:8 字节

double:8 字节

结构体的对齐方式由其最大成员的对齐值决定。

结构体 a 的大小计算
c
复制
typedef struct _a {
    char c1;    // 1 字节
    long i;     // 8 字节
    char c2;    // 1 字节
    double f;   // 8 字节
} a;
内存布局:
c1:1 字节

填充:7 字节(为了对齐 long i)

i:8 字节

c2:1 字节

填充:7 字节(为了对齐 double f)

f:8 字节

总大小:
1 + 7 + 8 + 1 + 7 + 8 = 32 字节

结构体 b 的大小计算
c
复制
typedef struct _b {
    char c1;    // 1 字节
    char c2;    // 1 字节
    long i;     // 8 字节
    double f;   // 8 字节
} b;
内存布局:
c1:1 字节

c2:1 字节

填充:6 字节(为了对齐 long i)

i:8 字节

f:8 字节

总大小:
1 + 1 + 6 + 8 + 8 = 24 字节

总结
结构体 a 的大小:32 字节

c1:1 字节

i:8 字节

c2:1 字节

f:8 字节

结构体 b 的大小:24 字节

c1:1 字节

c2:1 字节

i:8 字节

f:8 字节

通过调整成员顺序,结构体 b 的大小更小,这是因为减少了填充字节的数量。


http://www.niftyadmin.cn/n/5869294.html

相关文章

数据库的常见权限作用

在数据库管理中&#xff0c;权限设置是确保数据安全和访问控制的重要手段。下面列出的这些权限都是MySQL数据库系统中常见的用户权限类型&#xff0c;它们各自有不同的作用&#xff0c;下面我将详细解释每一个权限的作用&#xff1a; SELECT&#xff1a;允许用户查询数据库中的…

IP---网络类型

这只是IP的其中一块内容-网络类型&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为访问服务器流程&#xff0c;可通过以下路径查看IP----访问服务器流程-CSDN博客&#xff0c;欢迎指正 2.网络类型 网络类型---根据二层&#xff08;数据链路层&#xff09;所…

salesforce 实现自定义多选列表

在 Salesforce 中&#xff0c;默认的 Multi-Select Picklist 字段显示为下拉框&#xff0c;用户通过点击下拉框并选择多个选项&#xff0c;然后这些选项会被显示在字段内&#xff0c;用户需要点击右侧的“保存”按钮才能保存所选内容。这种行为在界面上并不像常见的 多选列表&a…

数据开发面试:DQL,

DQL常见面试题 where 和 having 的区别 三个排序开窗函数的区别 left join 用where 筛选 和 用on筛选的区别 ON 子句&#xff1a;用于定义连接条件&#xff0c;不会丢失左表的行。 WHERE 子句&#xff1a;用于过滤连接后的结果集&#xff0c;可能会丢失左表中没有匹配的行 …

国标28181协议在智联视频超融合平台中的接入方法

一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是国内视频行业最重要的国家标准&#xff0c;目前有三个版本&#xff1a; 2011 年&#xff1a;推出 GB/T 28181-2011 版本&#xff0c;为安防行业的前端设备、平…

Visual Studio Code FAQ

Visual Studio Code FAQ Visual Studio Code FAQVisual Studio Code 和 Visual Studio IDE 有什么区别&#xff1f;支持哪些作系统&#xff1f;VS Code 软硬件要求硬件平台不支持其他 Linux 要求 VS Code 是免费的吗&#xff1f;如何禁用遥测报告如何禁用试验 如何禁用崩溃报告…

力扣-动态规划-343 整数划分

思路 dp数组定义&#xff1a;i的最大化乘积为dp[i]递推公式&#xff1a;j取1到二分之i&#xff0c;然后分别求dp[i] max( dp[i], max(j*(i-j), j*dp[i-j]))dp数组初始化&#xff1a;dp[2] 1遍历顺序&#xff1a;顺序遍历时间复杂度&#xff1a; 代码 class Solution …

企业级大模型应用的Java-Python异构融合架构实践

一、后端语言相关技术生态 Python语言 Python在AI计算领域拥有全面的生态支持&#xff1a; 底层工具库: Pandas、NumPy、SciPy、Matplotlib深度学习框架: PyTorch、TensorFlow领域专用框架: HuggingFace Transformers&#xff08;社区生态为主&#xff09; 常见Python框架 …