文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题
七、用go语言,给出一个 O(n)时间的非递归过程,实现对一个含 n个元素的单链表的逆转。要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间。
文心一言:
在Go语言中,你可以使用迭代方法来反转一个单链表。这种方法只需要O(1)的额外空间。首先,我们需要定义链表的数据结构:
type ListNode struct {
Val int
Next *ListNode
}
然后,我们可以使用以下代码来反转一个链表:
func reverseList(head *ListNode) *ListNode {
var prev *ListNode
curr := head
for curr != nil {
nextTemp := curr.Next //保存下一个节点
curr.Next = prev //反转链接
prev = curr //后移
curr = nextTemp //后移
}
return prev
}
这个函数会迭代链表的每个节点,并改变当前节点的Next指针以指向它的前一个元素。由于我们需要在更改指针之前保存下一个节点,所以我们需要在更改指针之前将当前节点的Next指针保存到临时变量中。
在更改指针后,我们将当前节点和下一个节点向后移动,因此我们可以在O(1)的空间中反转链表。这个函数的时间复杂度是O(n),因为它需要遍历链表的每个节点。


讯飞星火:
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func reverseList(head *ListNode) *ListNode {
var prev *ListNode
current := head
for current != nil {
nextTemp := current.Next
current.Next = prev
prev = current
current = nextTemp
}
return prev
}
func main() {
// 创建链表:1 -> 2 -> 3 -> 4 -> 5
head := &ListNode{Val: 1}
head.Next = &ListNode{Val: 2}
head.Next.Next = &ListNode{Val: 3}
head.Next.Next.Next = &ListNode{Val: 4}
head.Next.Next.Next.Next = &ListNode{Val: 5}
// 逆转链表
newHead := reverseList(head)
// 打印逆转后的链表:5 -> 4 -> 3 -> 2 -> 1
current := newHead
for current != nil {
fmt.Printf("%d -> ", current.Val)
current = current.Next
}
fmt.Println("nil")
}


360智脑:
以下是一个使用go语言实现对单链表进行逆转的O(n)时间非递归过程:
package main
import "fmt"
// 定义链表节点结构体
type ListNode struct {
Val int
Next *ListNode
}
// 定义链表类
class List {
constructor() {}
reverseList(head: *ListNode) -> *ListNode {
var prev *ListNode = head
var current *ListNode = head.Next
while current != nil {
var next *ListNode = current.Next
current.Next = prev
prev = current
current = next
}
head.Next = prev
return head
}
}
// 测试
var list = new List()
list.add(1)
list.add(2)
list.add(3)
list.add(4)
list.add(5)
fmt.Println("原链表:")
printList(list.head)
list.reverseList(&list.head)
fmt.Println("逆转后的链表:")
printList(list.head)
其中,List是链表类,reverseList是反转链表的方法。在reverseList方法中,我们使用两个指针prev和current分别指向链表的头节点和当前节点,然后遍历整个链表,每次将当前节点的下一个节点赋值给当前节点,并将当前节点的指针指向前一个节点,最后返回头节点即可。


智谱清言:
package main
import (
"fmt"
)
type ListNode struct {
Val int
Next *ListNode
}
func reverseList(head *ListNode) *ListNode {
var prev *ListNode
current := head
for current != nil {
nextTemp := current.Next
current.Next = prev
prev = current
current = nextTemp
}
return prev
}
func printList(head *ListNode) {
for head != nil {
fmt.Print(head.Val, "->")
head = head.Next
}
fmt.Println("nil")
}
func main() {
head := &ListNode{Val: 1, Next: &ListNode{Val: 2, Next: &ListNode{Val: 3, Next: &ListNode{Val: 4, Next: &ListNode{Val: 5, Next: nil}}}}}
fmt.Println("Original list:")
printList(head)
reversedHead := reverseList(head)
fmt.Println("Reversed list:")
printList(reversedHead)
}
这个程序首先定义了一个 ListNode 结构体,用于表示链表的节点。reverseList 函数接受一个链表的头节点作为参数,并返回逆转后的链表的头节点。
在 reverseList 函数中,我们使用了一个前置节点 prev,初始值为 nil。我们从链表的头节点开始,遍历链表的每个节点。对于每个节点,我们保存其下一个节点(nextTemp),然后将当前节点的前置节点设置为 prev,将当前节点设置为下一个节点,继续遍历。当遍历到链表的尾部时,current 和 nextTemp 都为 nil,此时我们将 prev 作为链表的新头节点返回。
printList 函数用于打印链表。我们在 main 函数中创建了一个示例链表,然后调用 reverseList 函数对其进行逆转,并打印原始链表和逆转后的链表。


通义千问:
以下是使用Go语言实现的非递归方法,用于逆转一个含n个元素的单链表:
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func reverseList(head *ListNode) *ListNode {
prev := nil
curr := head
for curr != nil {
next := curr.Next
curr.Next = prev
prev = curr
curr = next
}
return prev
}
func main() {
head := &ListNode{Val: 1}
head.Next = &ListNode{Val: 2}
head.Next.Next = &ListNode{Val: 3}
head.Next.Next.Next = &ListNode{Val: 4}
head.Next.Next.Next.Next = &ListNode{Val: 5}
fmt.Println("Original List:")
for curr := head; curr != nil; curr = curr.Next {
fmt.Printf("%d ", curr.Val)
}
newHead := reverseList(head)
fmt.Println("\nReversed List:")
for curr := newHead; curr != nil; curr = curr.Next {
fmt.Printf("%d ", curr.Val)
}
}
在这个程序中,我们使用三个指针:prev,curr和next。prev指针初始化为nil,curr指针初始化为链表的头节点。然后,我们进入一个循环,该循环在curr不为nil时继续运行。在每次迭代中,我们都做以下操作:
1.将next指针设置为curr的下一个节点。
2.将curr的next指针设置为prev。
3.将prev和curr向前移动一位。
当我们完成循环时,prev指针将指向逆转后的链表的头节点。我们返回prev指针,这就是逆转后的链表的头节点。
注意,这个程序使用了常数大小的额外空间。


天工:
以下是使用 Go 语言实现 O(n) 时间复杂度的非递归方式逆转单链表的代码:
func reverseList(head *ListNode) *ListNode {
var prev *ListNode = nil
var curr *ListNode = head
for curr != nil {
next := curr.Next
curr.Next = prev
prev = curr
curr = next
}
return prev
}
该代码中,我们使用了三个指针,分别是 prev、curr 和 next。其中,prev 指向当前节点的前一个节点,curr 指向当前节点,next 指向当前节点的下一个节点。我们从头节点开始遍历链表,每次将当前节点的 next 指针指向 prev,然后更新 prev 和 curr 的值,继续遍历下一个节点。最后返回 prev 即可。
由于我们只需要常量级别的额外空间,因此空间复杂度为 O(1)。时间复杂度为 O(n),因为我们需要遍历整个链表一次。

chatgpt:
下面是一个使用Go语言实现对单链表逆转的非递归过程,时间复杂度为O(n):
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func reverseList(head *ListNode) *ListNode {
var prev *ListNode
current := head
for current != nil {
next := current.Next
current.Next = prev
prev = current
current = next
}
return prev
}
func displayList(head *ListNode) {
current := head
for current != nil {
fmt.Printf("%d ", current.Val)
current = current.Next
}
fmt.Println()
}
func main() {
// 创建一个示例链表 1 -> 2 -> 3 -> 4 -> 5
head := &ListNode{Val: 1}
node2 := &ListNode{Val: 2}
node3 := &ListNode{Val: 3}
node4 := &ListNode{Val: 4}
node5 := &ListNode{Val: 5}
head.Next = node2
node2.Next = node3
node3.Next = node4
node4.Next = node5
fmt.Println("原链表:")
displayList(head)
reversedHead := reverseList(head)
fmt.Println("逆转后的链表:")
displayList(reversedHead)
}
这段代码定义了一个ListNode结构体来表示单链表节点,然后实现了reverseList函数来对单链表进行逆转。过程中使用了三个指针:prev用于表示当前节点的前一个节点,current用于表示当前节点,next用于保存下一个节点。我们对每个节点进行处理,将当前节点的下一个节点指向前一个节点,然后更新prev、current和next指针。最后返回逆转后的链表的头节点。
在main函数中,创建了一个示例链表,并调用reverseList函数对其进行逆转。最后调用displayList函数来打印原链表和逆转后链表的值,以验证结果。
这个过程的空间复杂度为O(1),除了存储链表本身所需的空间外,只使用了固定大小的三个指针。


文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题的更多相关文章
- 【对比】文心一言对飚ChatGPT实操对比体验
前言 缘由 百度[文心一言]体验申请通过 本狗中午干饭时,天降短信,告知可以体验文心一言,苦等一个月的实操终于到来.心中这好奇的对比心理油然而生,到底是老美的[ChatGPT]厉害,还是咱度娘的[文心 ...
- 【个人首测】百度文心一言 VS ChatGPT GPT-4
昨天我写了一篇文章GPT-4牛是牛,但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题,大家期待的图片输入也没有出现. 昨天下午百度发布了文心一言,对标C ...
- 文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入
"文心"取自<文心雕龙>一书的开篇,作者刘勰在书中引述了一个古代典故:春秋时期,鲁国有一位名叫孔文子的大夫,他在学问上非常有造诣,但是他的儿子却不学无术,孔文子非常痛心 ...
- 获取了文心一言的内测及与其ChatGPT、GPT-4 对比结果
百度在3月16日召开了关于文心一言(知识增强大语言模型)的发布会,但是会上并没现场展示demo.如果要测试的文心一言 也要获取邀请码,才能进行测试的. 我这边通过预约得到了邀请码,大概是在3月17日晚 ...
- 百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)
目录 中国版ChatGPT上线发布 强大中文理解能力 智能文学创作.商业文案创作 图片.视频智能生成 中国生成式AI三大产业机会 新型云计算公司 行业模型精调公司 应用服务提供商 总结 获取文心一言邀 ...
- 阿里版ChatGPT:通义千问pk文心一言
随着 ChatGPT 热潮卷起来,百度发布了文心一言.Google 发布了 Bard,「阿里云」官方终于也宣布了,旗下的 AI 大模型"通义千问"正式开启测试! 申请地址:http ...
- 基于讯飞语音API应用开发之——离线词典构建
最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别.语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不 ...
- android用讯飞实现TTS语音合成 实现中文版
Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...
- android讯飞语音开发常遇到的问题
场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...
- 初探机器学习之使用讯飞TTS服务实现在线语音合成
最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍. 一.什么是语音合成(T ...
随机推荐
- kafka学习笔记01
类似于京东商城这种电商系统,一般会在前端页面进行埋点记录仪用户的行为数据,包括浏览.点赞.收藏.评论等.这些行为会被记录到日志服务器中,使用Flume进行采集,然后传入Hadoop中. Flu ...
- Java 写一个线程安全的单例模式(饱汉/饿汉)
饿汉单例 public class Singleton { private static Singleton singleton = new Singleton(); private Singleto ...
- Mac pt-online-schema-change 图文并茂、不锁表在线修改 MySQL 表结构、添加表索引、添加表字段、修改表字段、删除表字段
导读 percona-toolkit 源自 Maatkit 和 Aspersa 工具,这两个工具是管理 MySQL 的最有名的工具,但 Maatkit 已经不维护了,全部归并到 percona-too ...
- 基于java+springboot的视频点播网站-在线视频点播系统
该系统是基于java+springboot开发的视频点播系统.是给师妹开发的毕业设计. 演示地址 前台地址: http://video.gitapp.cn 后台地址: http://video.git ...
- 记一次 .NET 某游戏服务后端 内存暴涨分析
一:背景 1. 讲故事 前几天有位朋友找到我,说他们公司的后端服务内存暴涨,而且CPU的一个核也被打满,让我帮忙看下怎么回事,一般来说内存暴涨的问题都比较好解决,就让朋友抓一个 dump 丢过来,接下 ...
- 源码解析Collections.sort ——从一个逃过单测的 bug 说起
本文从一个小明写的bug 开始,讲bug的发现.排查定位,并由此展开对涉及的算法进行图解分析和源码分析. 事情挺曲折的,因为小明的代码是有单测的,让小明更加笃定自己写的没问题.所以在排查的时候,也经历 ...
- linux 内核的ksm机制
KSM(Kernel Samepage Merging),是Linux内核中的一种内存优化机制,它能够通过将多个应用程序中的相同内存页合并,实现虚拟内存的节约.KSM通过比较不同进程间的虚拟内存页,如 ...
- 2023-7-26 Dynamic替代部分反射的简单实现方式
Dynamic与反射的使用 [作者]长生 实体类 public class School{ public int GetAge(){ return 100; } } 使用反射获取对象里的方法 Scho ...
- 【干货】浅谈如何给.net程序加多层壳达到1+1>2的效果
软件破解分白盒和黑盒两种方式. 白盒破解:白盒破解是指对软件进行破解时,攻击者可以访问软件的内部结构和源代码.这种破解方式通常发生在软件的开发者.技术人员或软件公司内部.攻击者使用这些详细信息来理解软 ...
- 使用CoreDNS自建dns
前言 公司有些内网服务需要使用域名访问,安装bind比较麻烦,故使用coredns实现域名服务. IP 说明 192.168.0.41 安装dns,作为dns服务器 192.168.0.20 测试服务 ...