UE4 面试题整理

1、new与malloc的区别

new:

new首先会去调用operator new函数,申请足够的内存(大多数底层用malloc实现),然后调用类型的构造函数来初始化变量,最后返回自定义类型的指针,delete先调用析构函数,然后调用operator delete函数释放内存(大多数底层用free实现)

__cdecl 是C Declaration的缩写(declaration,声明)

malloc:

malloc是库函数,只能申请内存,没有初始化功能

所以new与malloc最大的区别就是new能进行构造函数初始化


2、strcpy、sprintf、memcpy的区别

strcpy:用于将一个字符串复制到另一个字符串中

sprintf:sprintf函数用于将格式化的字符串输出到一个字符数组中

char str[10];
int num = 4;
sprintf(str, "number is %d", num);
printf("%s\n", str); // 输出 number is 4

memcpy:用于将一个内存地址的数据复制到另一个内存地址中


3、子弹穿墙问题

子弹向前打出一个身位长的射线,若打到了墙面则开始计算子弹与墙的距离,在通过距离除以速度算出时间,时间过后则进行碰撞


4、UE4如何切关卡后保留数据

存放在GameInstancesubsystem中,不要存在gameinstance内,这样会导致项目臃肿


5、UE4客户端能否使用AIController

不可以,在DS(dedicated server)模型下,AIController只存在于服务端,其主要是通过在服务端对Pawn进行操控,
然后再同步到客户端。


6、Blueprintable与NotBlueprintable

将C++类加入蓝图类

如果为NotBlueprintable则不能被蓝图化


7、BlueprintImplementEvent与BlueprintNativeEvent的区别

如果实现了蓝图,那么C++的Implement接口则不调用

如果没写蓝图接口则调用C++接口

而BlueprintImplementEvent只是做接口给蓝图,不拓展C++接口。


8、C++类中默认有什么函数

1、构造函数

2、拷贝构造函数

3、析构函数

4、重载赋值运算符函数


9、UE4生命周期

从先到后:UGameEngine->GameInstance->World和WorldContext->PersistentLevel->GameMode->GameState->PlayerController->PlayerState->HUD->Character

在UGameEngine(继承自UEngine)

首先UEngine的子类有UGameEngine和UEditorEngine,UEngine中的GEngine有访问UE的全局资源,是一个很重要的指针。

void UGameEngine::Init(IEngineLoop* InEngineLoop)
{DECLARE_SCOPE_CYCLE_COUNTER(TEXT("UGameEngine Init"), STAT_GameEngineStartup, STATGROUP_LoadTime);// Call base.UEngine::Init(InEngineLoop);#if USE_NETWORK_PROFILERFString NetworkProfilerTag;if( FParse::Value(FCommandLine::Get(), TEXT("NETWORKPROFILER="), NetworkProfilerTag ) ){GNetworkProfiler.EnableTracking(true);}
#endif// Load and apply user game settingsGetGameUserSettings()->LoadSettings();GetGameUserSettings()->ApplyNonResolutionSettings();// Create game instance.  For GameEngine, this should be the only GameInstance that ever gets created.{FSoftClassPath GameInstanceClassName = GetDefault<UGameMapsSettings>()->GameInstanceClass;UClass* GameInstanceClass = (GameInstanceClassName.IsValid() ? LoadObject<UClass>(NULL, *GameInstanceClassName.ToString()) : UGameInstance::StaticClass());if (GameInstanceClass == nullptr){UE_LOG(LogEngine, Error, TEXT("Unable to load GameInstance Class '%s'. Falling back to generic UGameInstance."), *GameInstanceClassName.ToString());GameInstanceClass = UGameInstance::StaticClass();}GameInstance = NewObject<UGameInstance>(this, GameInstanceClass);GameInstance->InitializeStandalone();}//  	// Creates the initial world context. For GameEngine, this should be the only WorldContext that ever gets created.
//  	FWorldContext& InitialWorldContext = CreateNewWorldContext(EWorldType::Game);IMovieSceneCaptureInterface* MovieSceneCaptureImpl = nullptr;
#if WITH_EDITORif (!IsRunningDedicatedServer() && !IsRunningCommandlet()){MovieSceneCaptureImpl = IMovieSceneCaptureModule::Get().InitializeFromCommandLine();if (MovieSceneCaptureImpl){StartupMovieCaptureHandle = MovieSceneCaptureImpl->GetHandle();}}
#endif// Initialize the viewport client.UGameViewportClient* ViewportClient = NULL;if(GIsClient){ViewportClient = NewObject<UGameViewportClient>(this, GameViewportClientClass);ViewportClient->Init(*GameInstance->GetWorldContext(), GameInstance);GameViewport = ViewportClient;GameInstance->GetWorldContext()->GameViewport = ViewportClient;}LastTimeLogsFlushed = FPlatformTime::Seconds();// Attach the viewport client to a new viewport.if(ViewportClient){// This must be created before any gameplay code adds widgetsbool bWindowAlreadyExists = GameViewportWindow.IsValid();if (!bWindowAlreadyExists){UE_LOG(LogEngine, Log, TEXT("GameWindow did not exist.  Was created"));GameViewportWindow = CreateGameWindow();}CreateGameViewport( ViewportClient );if( !bWindowAlreadyExists ){SwitchGameWindowToUseGameViewport();}FString Error;if(ViewportClient->SetupInitialLocalPlayer(Error) == NULL){UE_LOG(LogEngine, Fatal,TEXT("%s"),*Error);}UGameViewportClient::OnViewportCreated().Broadcast();}UE_LOG(LogInit, Display, TEXT("Game Engine Initialized.") );// for IsInitialized()bIsInitialized = true;
}

 

 

UGameInstance继承自FExec,Exec就是UE4的命令行

void UGameInstance::InitializeStandalone(const FName InPackageName, UPackage* InWorldPackage)
{// Creates the world context. This should be the only WorldContext that ever gets created for this GameInstance.WorldContext = &GetEngine()->CreateNewWorldContext(EWorldType::Game);WorldContext->OwningGameInstance = this;// In standalone create a dummy world from the beginning to avoid issues of not having a world until LoadMap gets us our real worldUWorld* DummyWorld = UWorld::CreateWorld(EWorldType::Game, false, InPackageName, InWorldPackage);DummyWorld->SetGameInstance(this);WorldContext->SetCurrentWorld(DummyWorld);Init();
}

然后在GameInstance的初始化单例中生成对应的World和一个WorldContext

同时GameInstance内对GameMode进行绑定生成,但这个动作不是在初始化函数中进行的,而是在

在PreviewScene中在构造函数中调用了SetGameMode

World中在FSeamlessTravelHandler类中进行Tick设置

去调用的

 

然后在GameMode里面对所有的GameState,PlayerController,PlayerState,HUD和Default Panw,Spectator进行绑定

void UWorld::InitializeNewWorld(const InitializationValues IVS)
{if (!IVS.bTransactional){ClearFlags(RF_Transactional);}PersistentLevel = NewObject<ULevel>(this, TEXT("PersistentLevel"));PersistentLevel->Initialize(FURL(nullptr));PersistentLevel->Model = NewObject<UModel>(PersistentLevel);PersistentLevel->Model->Initialize(nullptr, 1);PersistentLevel->OwningWorld = this;// Create the WorldInfo actor.FActorSpawnParameters SpawnInfo; // Mark objects are transactional for undo/ redo.if (IVS.bTransactional){SpawnInfo.ObjectFlags |= RF_Transactional;PersistentLevel->SetFlags( RF_Transactional );PersistentLevel->Model->SetFlags( RF_Transactional );}else{SpawnInfo.ObjectFlags &= ~RF_Transactional;PersistentLevel->ClearFlags( RF_Transactional );PersistentLevel->Model->ClearFlags( RF_Transactional );}#if WITH_EDITORONLY_DATA// Need to associate current level so SpawnActor doesn't complain.CurrentLevel = PersistentLevel;
#endifSpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;// Set constant name for WorldSettings to make a network replication work between new worlds on host and clientSpawnInfo.Name = GEngine->WorldSettingsClass->GetFName();AWorldSettings* WorldSettings = SpawnActor<AWorldSettings>(GEngine->WorldSettingsClass, SpawnInfo );// Allow the world creator to override the default game mode in case they do not plan to load a level.if (IVS.DefaultGameMode){WorldSettings->DefaultGameMode = IVS.DefaultGameMode;}PersistentLevel->SetWorldSettings(WorldSettings);check(GetWorldSettings());
#if WITH_EDITORWorldSettings->SetIsTemporarilyHiddenInEditor(true);
#endif#if INCLUDE_CHAOS/*FChaosSolversModule* ChaosModule = FModuleManager::Get().GetModulePtr<FChaosSolversModule>("ChaosSolvers");check(ChaosModule);FActorSpawnParameters ChaosSpawnInfo;ChaosSpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;ChaosSpawnInfo.Name = TEXT("DefaultChaosActor");SpawnActor(ChaosModule->GetSolverActorClass(), nullptr, nullptr, ChaosSpawnInfo);check(PhysicsScene_Chaos);*/
#endif// Initialize the worldInitWorld(IVS);// Update components.UpdateWorldComponents( true, false );
}

在World内对PersistentLevel进行初始化,再对PersistentLevel中的WorldSetting进行设置,这里的WorldSetting设置只是Level与WorldSetting进行绑定,WorldSetting初始化还是在GameInstance里面

然后是GameMode,它负责什么呢?

1、Class登记:记录GameMode中各种类的信息

2、Spawn:创建Pawn和PlayerController等

3、游戏进度:游戏暂停重启的逻辑

4、过场动画逻辑

5、多人游戏的步调同步

GameState?

AGameState

AGameState用于保存游戏数据,如任务进度,打到了哪一个关卡什么的


10、sizeof与strlen的区别

sizeof包括最后的'\0',所以为4,strlen不包括最后的'\0',所以为3

sizeof是字节个数,不止用在字符串上,而strlen只能用在字符串上,输出字符串个数 


11、重写与重载的区别

1、重写是子类覆盖父类名字相同的方法,对其进行重新实现

2、重载有两种情况,在同一个类中,同一个方法名拥有不同的参数个数,或者同一个方法名拥有参数个数相同的不同类型参数


12、构造函数和析构函数都能加Virtual吗?

虚函数

虚函数跟着对象走 

函数名后面加override没有任何功能性作用,只是开发规范要求写上。

override作用或C++语言哲学:将大多数错误暴露在编译阶段

普通函数属于编译期状态,虚函数属于运行期状态。

编译器是看代码人就知道答案,运行期是看代码也不能清楚答案。

基类析构函数都要加virtual

如果析构函数不加virtual,普通成员函数跟类走,那么delete p;就会去调用p的类型的析构函数即Animal的析构函数

加了情况就一不一样: 

构造函数是用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成(普通函数属于编译期状态,虚函数属于运行期状态),所以不能将构造函数定义为虚函数,通常析构函数才会用virtual修饰(虚函数实际存放在对象的头部的虚函数表中的)

所以构造函数不能加virtual,析构函数子类必须加virtual


13、UCLASS、GENERATED_BODY以及为何要加 文件名.generated.h

1、GENERATED_BODY

通过当前文件ID以及行号来建立一个唯一的键值名称

2、UCLASS

与GENERATED_BODY是一样的 

3、xxx.generated.h

在Intermediate(中间生成文件)中生成,这个生成是在项目文件编译成功后它会自动生成xxx.generated.h以及xxx.gen.cpp

结合之前的UCLASS和GENERATED_BODY

.generated.h里面生成了这些文件,是通过UCLASS和GENERATED_BODY来生成的

例如GENRATED_BODY在18行,CURRENT_FILE_ID为first_Source_first_SCharacter_h

注意这个DECLARE_CLASS

下一张图引用:UE4 UObject系列之UClass(二) - 知乎

这里完成了对反射类型做了操作

同时还在里面对new进行了重载

最后new出来的对象在UClass内对类进行注册,构建了基础的反射系统

我遇到的反射的问题:

1、当你生成了Intermediate中的反射文件.gen和.generated文件后,GENERATED_BODY()这种宏不能挪位置因为已经标明了对应的行号了,必须重新Generate Visual Studio project files才能继续正常运行


14、UE4内存管理

内存管理机制的三种形式

1、垃圾回收

2、智能指针

3、C++内存管理(malloc realloc calloc new)

一、对非UObject类型进行TSharedPtr管理,不能用于UObject对象,不然等TSharedPtr释放后,UObject自带的GC机制再去进行垃圾回收就会引起两次free的异常

二、以及对UObject类型进行GC机制的回收

三、UE4中的C++内存管理通常通过FMalloc以及GMalloc进行管理

class CORE_API FMalloc  : public FUseSystemMallocForNew,public FExec
{
public:virtual void* Malloc( SIZE_T Count, uint32 Alignment=DEFAULT_ALIGNMENT ) = 0;virtual void* TryMalloc( SIZE_T Count, uint32 Alignment=DEFAULT_ALIGNMENT );virtual void* Realloc( void* Original, SIZE_T Count, uint32 Alignment=DEFAULT_ALIGNMENT ) = 0;virtual void* TryRealloc(void* Original, SIZE_T Count, uint32 Alignment=DEFAULT_ALIGNMENT);virtual void Free( void* Original ) = 0

 为了在调用new/delete能够调用ue4的自定义函数,ue4内部替换了operator new。这一替换是通过IMPLEMENT_MODULE宏引入的

FMallocBinned使用freelist机制管理空闲内存。每个空闲块的信息记录在FFreeMem结构中,显式存储。

FMallocBinned使用内存池机制,内部包含POOL_COUNT(42)个内存池和2个扩展的页内存池;其中每个内存池的信息由FPoolInfo结构体维护,记录了当前FreeMem内存块指针等,而特定大小的所有内存池由FPoolTable维护;内存池内包含了内存块的双向链表。


15、情况一: UObject对象中有UObject成员

UObject成员加入UPROPERTY,由于UObject对象有肯定是被实例化的且UObject本身就存在垃圾回收,自己是实例化出来的,引用计数肯定大于等于1,在UObject对象中又有对UObject成员的引用,则不会被自动销毁

总结:UObject本身就在垃圾回收机制内,只需加入UPROPERTY就可以将UObject成员加入垃圾回收机制且有UObject对象对UObject成员的引用

      情况二: 非UObject对象中有UObject成员

方法一:由于非UObject对象并不具备垃圾回收机制,所以就必须手动将UObject对象加入引用,首先先继承自FGCObject,再重写AddReferenceObjects函数,使得UObject成员加入回收机制

class NotObject : public FGCObject {
public:UObject* CollectorObject;void AddReferencedObjects(FReferenceCollector& ReferenceCollector) override {ReferenceCollector.AddReferencedObject(CollectorObject);}
}

当NotObject被销毁时,CollectorObject的引用也会自动清除,引用计数为0即被销毁

方法二:

NotObject* notObject;
notObject->AddToRoot();

将对象AddToRoot,使得变量不会被自动GC,在析构函数调用notObject->RemoveFromRoot(),防止内存泄漏

总结:非UObject对象继承自FGCObject,然后重写AddReferencedObjects函数,将对象成员加入垃圾回收机制

          非UObject对象,将对象AddToRoot(),这样非UObject对象的UObject成员都加入垃圾回收机制,非UObject成员通过new/delete进行管理


16、什么时候会调用EndPlay事件

1、手动销毁Actor时

2、切换关卡时


17、UE4中Class与Struct有什么区别

1、对于C++而言,class变量函数默认为private,而struct变量函数默认为public

2、对于UE4而言,class可以将函数暴露给UE4编辑器,例如BlueprintCallable、BlueprintNativeEvent、BlueprintImplement等,而struct不能

3、对于UE4而言,class能够继承、struct不能继承,若class继承自uobject类,则class自带垃圾回收功能,就不能用智能指针,否则会造成double free,struct虽然是USTRUCT的宏修饰,但是它并不继承自uobject,且不能继承,所以它没有自带垃圾回收,可以与智能指针搭配调用


18、UE4中线程的种类

1、渲染线程

2、游戏线程

3、GPU线程


19、UE4的多线程有哪些?具体怎么使用?

1、FRunnable

2、AsyncTask

3、TaskGraph

一、FRunnable

首先它不是UObject类,记得手动delete掉,它内在函数有六个,其中五个是常用的:

1、Init(),返回值是一个bool,Run根据这个bool确定是否执行

2、Run(),若Init返回值会true且存在一个FRunnableThread线程,两者成立执行内部方法

3、Stop()

通常对Run中的while条件变为false例如:

递增了就不为1,Run的内部逻辑就停止运行

4、Exit()

唤起主线程

5、析构函数

通常对FRunnableThread指针等内容给清空

但想要真的能够让Run跑起来,还需要一个FRunnableThread

AysncTask:

UE并发-线程池和AsyncTask - 知乎 (zhihu.com)

【UE4 C++ 基础知识】<14> 多线程——AsyncTask - 砥才人 - 博客园 (cnblogs.com)

最简单的使用方法

但这个内部实现用的还是TaskGraph


// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Async/AsyncWork.h"
#include "HAL/ThreadManager.h"class FAsyncTK : public FNonAbandonableTask
{friend class FAutoDeleteAsyncTask<FAsyncTK>;int32 ExampleData;float WorkingTime;public:FAsyncTK(int32 InExampleData, float TheWorkingTime = 1): ExampleData(InExampleData), WorkingTime(TheWorkingTime) { }~FAsyncTK() {Log(__FUNCTION__);}// 执行任务(必须实现)void DoWork() {// do the work...//FPlatformProcess::Sleep(WorkingTime);Log(__FUNCTION__);}// 用时统计对应的ID(必须实现)FORCEINLINE TStatId GetStatId() const{RETURN_QUICK_DECLARE_CYCLE_STAT(ExampleAsyncTask, STATGROUP_ThreadPoolAsyncTasks);}void Log(const char* Action){uint32 CurrentThreadId = FPlatformTLS::GetCurrentThreadId();FString CurrentThreadName = FThreadManager::Get().GetThreadName(CurrentThreadId);UE_LOG(LogTemp, Display, TEXT("%s[%d] - %s, ExampleData=%d"), *CurrentThreadName, CurrentThreadId,ANSI_TO_TCHAR(Action), ExampleData);}
};

TaskGraph:

虚幻4之TaskGraph:十分钟上手TaskGraph - 知乎 (zhihu.com)

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"class TKGraph
{FString FileContent;
public:TKGraph(FString InFileContent) :FileContent(MoveTemp(InFileContent)){}FORCEINLINE TStatId GetStatId() const {RETURN_QUICK_DECLARE_CYCLE_STAT(FTaskCompletion_LoadFileToString,STATGROUP_TaskGraphTasks);}static ENamedThreads::Type GetDesiredThread() { return ENamedThreads::GameThread; }static ESubsequentsMode::Type GetSubsequentsMode(){return ESubsequentsMode::TrackSubsequents;}void DoTask(ENamedThreads::Type CurrentThread,const FGraphEventRef& MyCompletionGraphEvent) {check(IsInGameThread());GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Green, TEXT("TASKGRAPH"));}
};
TGraphTask<TKGraph>::CreateTask().ConstructAndDispatchWhenReady("pink");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/299919.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“AI复活”背后的数字永生:被期待成为下一个电商,培育市场认知和用户心智还需时间

“AI复活”背后的数字永生&#xff1a;被期待成为下一个电商&#xff0c;培育市场认知和用户心智还需时间© 由 九派新闻 提供 数字永生&#xff0c;还是电子宠物&#xff1f;过去一个月&#xff0c;因包小柏用AI技术让爱女在数字世界“复活”一事&#xff0c;《流浪地球2…

java 基本类型与包装类

8种基本类型与对应的包装类 尽量不要使用构造方法&#xff0c;因为构造方法已经过时了 自动装箱 自动装箱&#xff1a;基本自动转换为包装类 Integer a 3&#xff1b; 虽然所有的类中有类似于parseInt这种方法&#xff0c;但是所有类中都有valueOf方法&#xff0c;推荐使用va…

护眼落地灯到底是不是智商税?六种实用挑选方法帮你排雷避坑!

光线对眼睛的影响是不可忽视的。现代人由于长时间使用电子产品&#xff0c;如电脑、手机等&#xff0c;往往会处于高强度的光线照射下&#xff0c;导致眼睛疲劳、干涩、红肿等问题。而长期处于光线不足的环境中&#xff0c;又容易引发视力下降等眼部问题。因此&#xff0c;保护…

【机器学习入门】使用YOLO模型进行物体检测

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 文章目录 系列文章目录前…

静态路由协议实验综合实验

需求&#xff1a; 1、除R5的换回地址已固定外&#xff0c;整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口&#xff0c;用于模拟连接PC的网段&#xff1b;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…

Android14应用启动流程(源码+Trace)

1.简介 应用启动过程快的都不需要一秒钟&#xff0c;但这整个过程的执行是比较复杂的&#xff0c;无论是对手机厂商、应用开发来说启动速度也是核心用户体验指标之一&#xff0c;本文采用Android14源码与perfetto工具进行解析。 源码参考地址&#xff1a;Search trace分析工…

Redis的配置文件详解

单位&#xff1a;Redis配置对大小写不敏感&#xff01; 注意这里&#xff1a;任何写法都可&#xff0c;不区分大小写。 units are case insensitive so 1GB 1Gb 1gB are all the same.包含&#xff1a;搭建Redis集群时&#xff0c;可以使用includes包含其他配置文件网络&…

在c# 7.3中不可用,请使用9.0或更高的语言版本

参考连接&#xff1a;在c# 7.3中不可用,请使用8.0或更高的语言版本_功能“可为 null 的引用类型”在 c# 7.3 中不可用。请使用 8.0 或更高的语言版本-CSDN博客https://blog.csdn.net/liangyely/article/details/106163660 [踩坑记录] 某功能在C#7.3中不可用,请使用 8.0 或更高的…

RGB三通道和灰度值的理解

本文都是来自于chatGPT的回答!!! 目录 Q1:像素具有什么属性?Q2:图像的色彩是怎么实现的?Q3:灰度值和颜色值是一个概念吗?Q4:是不是像素具有灰度值&#xff0c;也有三个颜色分量RGB&#xff1f;Q5:灰度图像是没有色彩的吗&#xff1f;Q6: 彩色图像是既具有灰度值也具有RGB三…

【JavaWeb】Day30.SpringBootWeb请求响应——响应

响应 HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有请求就有响应&#xff09;那么Controller程序&#xff0c;除了接收请求外&#xff0c;还可以进行响应。 1.ResponseBody 在我们前面所编写的controller方法中&#xff0c;都已经设置了响应数据。 controller方…

利用甘特图实现精细化项目管控

在项目管理中,通过精细化管控,项目经理能够有效规划、监督和协调各项任务,从而最大限度控制风险,优化资源配置,并确保按时、按质、按量完成项目目标。而在众多项目管理工具中,甘特图无疑是实现精细化项目管控的利器。zz-plan 是一个非常好用的在线甘特图制作工具&#xff0c;一…

【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

先序遍历&#xff1a;根-左-右中序遍历&#xff1a;左-根-右后序遍历&#xff1a;左-右-根 94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3…

【三十五】【算法分析与设计】综合练习(2),22。 括号生成,77。 组合,494。 目标和,模拟树递归,临时变量自动维护树定义,递归回溯,非树结构模拟树

22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["&#xff08;&#xff08;&#xff08;&#xff09;&#xff09;&#xff0…

C 回调函数的两种使用方法

对回调&#xff08;callback&#xff09;函数的一点粗陋理解&#xff0c;在我小时候&#xff0c;隔壁村有家月饼小作坊&#xff08;只在中秋那段时间手工制作一些月饼出售&#xff0c;后来好像不做了&#xff09;&#xff0c;做出的月饼是那种很传统很经典的款式&#xff0c;里…

金融中的数学模型

平稳时间序列 时间序列的基本统计特性&#xff0c;如均值、方差和自相关等&#xff0c;在时间上不随时间的推移而发生显著的变化。 平稳时间序列通常具有以下特征&#xff1a; 均值不随时间变化&#xff1a;序列的均值在时间上保持恒定。方差不随时间变化&#xff1a;序列的…

人工智能上手 Pytorch

人工智能上手 Pytorch 1、人工智能框架历史走向 2015年&#xff0c; caffe&#xff0c;优势配置简单&#xff0c;缺点安装麻烦&#xff0c;且不更新维护 2016年&#xff0c;tensorflow 1.x&#xff0c;定义太严格&#xff0c;很复杂。开发成本高。简单的任务&#xff0c;也很…

DVWA -File Upload-通关教程-完结

DVWA -File Upload-通关教程-完结 文章目录 DVWA -File Upload-通关教程-完结页面功能LowMediumHighImpossible 页面功能 此页面的功能为选择某个图片文件点击Upload按钮上传&#xff0c;上传成功后得知文件上传路径为DVWA\hackable\uploads。 Low 源码审计 这段 PHP 代码…

Unknown redis exception; event execu tor terminated;解决

最近查看服务器日记是不是报发现有台服务器报错&#xff1a; rocessing failed; nested exception is org.springframework.data.redis.RedisSystemException: Unknown redis exception; nested exception is java.util.concurrent.RejectedExecutionException: event execu …

58商铺全新UI试客试用平台网站php源码

探索未来商铺新纪元&#xff0c;58商铺全新UI试客试用平台网站PHP源码完整版震撼来袭&#xff01; 在这个数字化飞速发展的时代&#xff0c;58商铺一直致力于为商家和消费者打造更加便捷、高效的交易平台。今天&#xff0c;我们荣幸地推出全新UI试客试用平台网站PHP源码完整版…

免注册,ChatGPT可即时访问了!

AI又有啥进展&#xff1f;一起看看吧 Apple进军个人家用机器人 Apple在放弃自动驾驶汽车项目并推出混合现实头显后&#xff0c;正在进军个人机器人领域&#xff0c;处于开发家用环境机器人的早期阶段 报告中提到了两种可能的机器人设计。一种是移动机器人&#xff0c;可以跟…