文心一言 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 ... 
随机推荐
- 寻找一个好的工程师不只是看ta的刷题能力
			面试一个工程师,该考察什么能力,如果单单背诵一些概念.题目好像是在考察记忆力,最终项目里还是得解决实际问题.但解决实际问题的能力真的不易考察,导致大部分公司面试前期都只能通过试题来筛选求职者,到面试后 ... 
- tomcat Filter内存马
			idea调试的时候加入源代码 <dependency> <groupId>org.apache.tomcat</groupId> <artifactId> ... 
- 记一次 .NET 某医院预约平台 非托管泄露分析
			一:背景 1. 讲故事 前几天有位朋友找到我,说他的程序有内存泄露,让我帮忙排查一下,截图如下: 说实话看到 32bit, 1.5G 这些关键词之后,职业敏感告诉我,他这个可能是虚拟地址紧张所致,不管 ... 
- 论文日记二:VGG
			1. 导读 前面我们回顾了AlexNet,AlexNet的作者指出模型的深度很重要,而VGG最大的贡献就在于对网络模型深度的研究. VGG原论文:<Very Deep Convolutional ... 
- 4.10 x64dbg 反汇编功能的封装
			LyScript 插件提供的反汇编系列函数虽然能够实现基本的反汇编功能,但在实际使用中,可能会遇到一些更为复杂的需求,此时就需要根据自身需要进行二次开发,以实现更加高级的功能.本章将继续深入探索反汇编 ... 
- JavaScript中this的绑定
			<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path s ... 
- Linux 基础(一)
			Linux 基础(一) 理念 一切皆文件 硬件 文件名 显示器 fb0 鼠标 mouse1 键盘 event0 触摸屏 event1 摄像头 video0 打开摄像头:open video0 打开 ... 
- opencv中的函数
			读入图像:cv2.imread(),第一个参数:未文件路径,第二个参数:告诉函数要以何种方式读取图片. cv2.IMREAD_COLOR:读入一幅彩色图像.图像的透明度会被忽略. cv2.IMREAD ... 
- 但因热爱,愿迎万难,OpenTiny 社区增加一枚前端程序媛贡献者🎉
			我们非常高兴地宣布,OpenTiny Vue Playground 正式上线! 链接:https://opentiny.github.io/tiny-vue-playground/ 在此非常感谢 xi ... 
- 青少年CTF平台-Web-PingME
			题目描述 题目难度一颗星,五十分. 解题记录 进入题目中,发现这是一个ping功能 我们用连字符||进行分割两个语句,保证同时运行且输出. Payload为127.0.0.1 || ls 发现有fla ... 
