數據之路 - Python爬蟲 - 數據存儲

一、文件存儲

1.文件打開方式

文件打開方式說明
r以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式
rb以二進制只讀方式打開一個文件。文件指針將會放在文件的開頭
r+以讀寫方式打開一個文件。文件指針將會放在文件的開頭
rb+以二進制讀寫方式打開一個文件。文件指針將會放在文件的開頭
w以寫入方式打開一個文件。如果該文件已存在,則將其覆蓋。如果該文件不存在,則創建新文件
wb以二進制寫入方式打開一個文件。如果該文件已存在,則將其覆蓋。如果該文件不存在,則創建新文件
w+以讀寫方式打開一個文件。如果該文件已存在,則將其覆蓋。如果該文件不存在,則創建新文件
wb+以二進制讀寫格式打開一個文件。如果該文件已存在,則將其覆蓋。如果該文件不存在,則創建新文件
a以追加方式打開一個文件。如果該文件已存在,文件指針將會放在文件結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,則創建新文件來寫入
ab以二進制追加方式打開一個文件。如果該文件已存在,則文件指針將會放在文件結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,則創建新文件來寫入
a+以讀寫方式打開一個文件。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,則創建新文件來讀寫
ab+以二進制追加方式打開一個文件。如果該文件已存在,則文件指針將會放在文件結尾。如果該文件不存在,則創建新文件用于讀寫

2.txt文本存儲

with open('explore.txt', 'a', encoding='utf-8') as file:file.write('\n'.join([question, author, answer]))file.write('\n' + '=' * 50 + '\n')

3.json文件存儲

調用庫的loads()方法將JSON文本字符串轉為JSON對象,可以通過dumps()方法將JSON對象轉為文本字符串

- 讀取json

import jsonstr = '''
[{"name": "Bob","gender": "male","birthday": "1992-10-18"
}, {"name": "Selina","gender": "female","birthday": "1995-10-18"
}]
'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))

- 輸出json

import jsondata = [{'name': 'Bob','gender': 'male','birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:file.write(json.dumps(data))

4.csv文件存儲

- 寫入

首先,打開data.csv文件,然后指定打開的模式為w(即寫入),獲得文件句柄,隨后調用csv庫的writer()方法初始化寫入對象,傳入該句柄,然后調用writerow()方法傳入每行的數據即可完成寫入。writerows()方法同時寫入多行

import csvwith open('data.csv', 'w') as csvfile:writer = csv.writer(csvfile, delimiter=' ')writer.writerow(['id', 'name', 'age'])writer.writerow(['10001', 'Mike', 20])writer.writerow(['10002', 'Bob', 22])writer.writerow(['10003', 'Jordan', 21])

- 讀取

import csvwith open('data.csv', 'r', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)for row in reader:print(row)

二、MySQL關系型數據庫存儲

1.MySQL連接

import pymysql
# connect()方法聲明一個MySQL連接對象
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)
# cursor()方法獲得MySQL的操作游標,利用游標來執行SQL語句
cursor = db.cursor()
# 創建students數據表
sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
cursor.execute(sql)

2.插入

import pymysqlid = '20120001'
user = 'Bob'
age = 20db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
sql = 'INSERT INTO students(id, name, age) values(%s, %s, %s)'
try:cursor.execute(sql, (id, user, age))db.commit()
except:db.rollback()
db.close()
==================================================================================================
data = {'id': '20120001','name': 'Bob','age': 20 } table = 'students' keys = ', '.join(data.keys()) values = ', '.join(['%s'] * len(data)) sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values) try:if cursor.execute(sql, tuple(data.values())):print('Successful')db.commit() except:print('Failed')db.rollback() db.close()

3.更新

sql = 'UPDATE students SET age = %s WHERE name = %s'
try:cursor.execute(sql, (25, 'Bob'))db.commit()
except:db.rollback()
db.close()
===========================================================================================================================
data = {'id': '20120001','name': 'Bob','age': 21
}table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys, values=values)
update = ','.join([" {key} = %s".format(key=key) for key in data])
sql += update
try:if cursor.execute(sql, tuple(data.values())*2):print('Successful')db.commit()
except:print('Failed')db.rollback()
db.close()

4.刪除

table = 'students'
condition = 'age > 20'sql = 'DELETE FROM  {table} WHERE {condition}'.format(table=table, condition=condition)
try:cursor.execute(sql)db.commit()
except:db.rollback()db.close()

5.查詢

sql = 'SELECT * FROM students WHERE age >= 20'try:cursor.execute(sql)print('Count:', cursor.rowcount)one = cursor.fetchone()print('One:', one)results = cursor.fetchall()print('Results:', results)print('Results Type:', type(results))for row in results:print(row)
except:print('Error')

三、MongoDB非關系型數據庫存儲

1.MongoDB連接

import pymongo
# 連接MongoDB
client = pymongo.MongoClient(host='localhost', port=27017)
# 指定數據庫
db = client.test
# 指定集合(類似于數據表)
collection = db.students

2.插入

student = {'id': '20170101','name': 'Jordan','age': 20,'gender': 'male'
}student1 = {'id': '20170101','name': 'Jordan','age': 20,'gender': 'male'
}student2 = {'id': '20170202','name': 'Mike','age': 21,'gender': 'male'
}result = collection.insert(student)
result = collection.insert([student1, student2])
result = collection.insert_many([student1, student2])
print(result)

3.查詢

# find_one()查詢得到的是單個結果,find()則返回一個生成器對象。
result = collection.find_one({'name': 'Mike'})
result = collection.find_all({'name': 'Mike'})

- 常用符號

符號類型符號含義示例
比較符號$lt小于{'age': {'$lt': 20}}
$gt大于{'age': {'$gt': 20}}
$lte小于等于{'age': {'$lte': 20}}
$gte大于等于{'age': {'$gte': 20}}
$ne不等于{'age': {'$ne': 20}}
$in在范圍內{'age': {'$in': [20, 23]}}
$nin不在范圍內{'age': {'$nin': [20, 23]}}
功能符號$regex匹配正則表達式,name以M開頭{'name': {'$regex': '^M.*'}}
$exists屬性是否存在,name屬性存在{'name': {'$exists': True}}
$type類型判斷,age的類型為int{'age': {'$type': 'int'}}
$mod數字模操作,年齡模5余0{'age': {'$mod': [5, 0]}}
$text文本查詢,text類型的屬性中包含Mike字符串{'$text': {'$search': 'Mike'}}
$where高級條件查詢,自身粉絲數等于關注數{'$where': 'obj.fans_count == obj.follows_count'}

4.更新

condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, student)
print(result)# update_many()方法,則會將所有符合條件的數據都更新
# update_one()方法,則會將單個符合條件的數據都更新

5.刪除

# remove()將符合條件的所有數據刪除
result = collection.remove({'name': 'Kevin'})
print(result)
# delete_one()刪除第一條符合條件的數據
result = collection.delete_one({'name': 'Kevin'})
print(result)
print(result.deleted_count)
# delete_many()即刪除所有符合條件的數據
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)
# deleted_count屬性獲取刪除的數據條數

四、Redis非關系型數據庫存儲

1.Redis連接

from redis import StrictRedisredis = StrictRedis(host='localhost', port=6379, db=0, password='foobared')
redis.set('name', 'Bob')    
print(redis.get('name'))    

2.鍵操作

方法作用參數說明
exists(name)判斷一個鍵是否存在name:鍵名
delete(name)刪除一個鍵name:鍵名
type(name)判斷鍵類型name:鍵名
keys(pattern)獲取所有符合規則的鍵pattern:匹配規則
randomkey()獲取隨機的一個鍵?
rename(src, dst)重命名鍵src:原鍵名;dst:新鍵名
dbsize()獲取當前數據庫中鍵的數目?
expire(name, time)設定鍵的過期時間,單位為秒name:鍵名;time:秒數
ttl(name)獲取鍵的過期時間,單位為秒,-1表示永久不過期name:鍵名
move(name, db)將鍵移動到其他數據庫name:鍵名;db:數據庫代號
flushdb()刪除當前選擇數據庫中的所有鍵?
flushall()刪除所有數據庫中的所有鍵?

3.字符串操作

方法作用參數說明
set(name, value)給數據庫中鍵為namestring賦予值valuename: 鍵名;value: 值
get(name)返回數據庫中鍵為namestringvaluename:鍵名
getset(name, value)給數據庫中鍵為namestring賦予值value并返回上次的valuename:鍵名;value:新值
mget(keys, *args)返回多個鍵對應的valuekeys:鍵的列表
setnx(name, value)如果不存在這個鍵值對,則更新value,否則不變name:鍵名
setex(name, time, value)設置可以對應的值為string類型的value,并指定此鍵值對應的有效期name: 鍵名;time: 有效期;?value:值
setrange(name, offset, value)設置指定鍵的value值的子字符串name:鍵名;offset:偏移量;value:值
mset(mapping)批量賦值mapping:字典
msetnx(mapping)鍵均不存在時才批量賦值mapping:字典
incr(name, amount=1)鍵為namevalue增值操作,默認為1,鍵不存在則被創建并設為amountname:鍵名;amount:增長的值
decr(name, amount=1)鍵為namevalue減值操作,默認為1,鍵不存在則被創建并將value設置為-amountname:鍵名;?amount:減少的值
append(key, value)鍵為namestring的值附加valuekey:鍵名
substr(name, start, end=-1)返回鍵為namestring的子串name:鍵名;start:起始索引;end:終止索引,默認為-1,表示截取到末尾
getrange(key, start, end)獲取鍵的value值從startend的子字符串key:鍵名;start:起始索引;end:終止索引

4.列表操作

方法作用參數說明
rpush(name, *values)在鍵為name的列表末尾添加值為value的元素,可以傳多個name:鍵名;values:值
lpush(name, *values)在鍵為name的列表頭添加值為value的元素,可以傳多個name:鍵名;values:值
llen(name)返回鍵為name的列表的長度name:鍵名
lrange(name, start, end)返回鍵為name的列表中startend之間的元素name:鍵名;start:起始索引;end:終止索引
ltrim(name, start, end)截取鍵為name的列表,保留索引為startend的內容name:鍵名;start:起始索引;end:終止索引
lindex(name, index)返回鍵為name的列表中index位置的元素name:鍵名;index:索引
lset(name, index, value)給鍵為name的列表中index位置的元素賦值,越界則報錯name:鍵名;index:索引位置;value:值
lrem(name, count, value)刪除count個鍵的列表中值為value的元素name:鍵名;count:刪除個數;value:值
lpop(name)返回并刪除鍵為name的列表中的首元素name:鍵名
rpop(name)返回并刪除鍵為name的列表中的尾元素name:鍵名
blpop(keys, timeout=0)返回并刪除名稱在keys中的list中的首個元素,如果列表為空,則會一直阻塞等待keys:鍵列表;timeout: 超時等待時間,0為一直等待
brpop(keys, timeout=0)返回并刪除鍵為name的列表中的尾元素,如果list為空,則會一直阻塞等待keys:鍵列表;timeout:超時等待時間,0為一直等待
rpoplpush(src, dst)返回并刪除名稱為src的列表的尾元素,并將該元素添加到名稱為dst的列表頭部src:源列表的鍵;dst:目標列表的key

5.集合操作

方法作用參數說明
sadd(name, *values)向鍵為name的集合中添加元素name:鍵名;values:值,可為多個
srem(name, *values)從鍵為name的集合中刪除元素name:鍵名;values:值,可為多個
spop(name)隨機返回并刪除鍵為name的集合中的一個元素name:鍵名
smove(src, dst, value)從src對應的集合中移除元素并將其添加到dst對應的集合中src:源集合;dst:目標集合;value:元素值
scard(name)返回鍵為name的集合的元素個數name:鍵名
sismember(name, value)測試member是否是鍵為name的集合的元素name:鍵值
sinter(keys, *args)返回所有給定鍵的集合的交集keys:鍵列表
sinterstore(dest, keys, *args)求交集并將交集保存到dest的集合dest:結果集合;keys:鍵列表
sunion(keys, *args)返回所有給定鍵的集合的并集keys:鍵列表
sunionstore(dest, keys, *args)求并集并將并集保存到dest的集合dest:結果集合;keys:鍵列表
sdiff(keys, *args)返回所有給定鍵的集合的差集keys:鍵列表
sdiffstore(dest, keys, *args)求差集并將差集保存到dest集合dest:結果集合;keys:鍵列表
smembers(name)返回鍵為name的集合的所有元素name:鍵名
srandmember(name)隨機返回鍵為name的集合中的一個元素,但不刪除元素name:鍵值

6.有序集合操作

方法作用參數說明
zadd(name, *args, **kwargs)向鍵為name的zset中添加元素member,score用于排序。如果該元素存在,則更新其順序name: 鍵名;args:可變參數
zrem(name, *values)刪除鍵為name的zset中的元素name:鍵名;values:元素
zincrby(name, value, amount=1)如果在鍵為name的zset中已經存在元素value,則將該元素的score增加amount;否則向該集合中添加該元素,其score的值為amountname:key名;value:元素;amount:增長的score值
zrank(name, value)返回鍵為name的zset中元素的排名,按score從小到大排序,即名次name:鍵名;value:元素值
zrevrank(name, value)返回鍵為name的zset中元素的倒數排名(按score從大到小排序),即名次name:鍵名;value:元素值
zrevrange(name, start, end, withscores=False)返回鍵為name的zset(按score從大到小排序)中index從start到end的所有元素name:鍵值;start:開始索引;end:結束索引;withscores:是否帶score
zrangebyscore(name, min, max, start=None, num=None, withscores=False)返回鍵為name的zset中score在給定區間的元素name:鍵名;min:最低score;max:最高score;start:起始索引;num:個數;withscores:是否帶score
zcount(name, min, max)返回鍵為name的zset中score在給定區間的數量name:鍵名;min:最低score;max:最高score
zcard(name)返回鍵為name的zset的元素個數name:鍵名
zremrangebyrank(name, min, max)刪除鍵為name的zset中排名在給定區間的元素name:鍵名;min:最低位次;max:最高位次
zremrangebyscore(name, min, max)刪除鍵為name的zset中score在給定區間的元素name:鍵名;min:最低score;max:最高score

7.散列操作

方法作用參數說明
hset(name, key, value)向鍵為name的散列表中添加映射name:鍵名;key:映射鍵名;value:映射鍵值
hsetnx(name, key, value)如果映射鍵名不存在,則向鍵為name的散列表中添加映射name:鍵名;key:映射鍵名;value:映射鍵值
hget(name, key)返回鍵為name的散列表中key對應的值name:鍵名;key:映射鍵名
hmget(name, keys, *args)返回鍵為name的散列表中各個鍵對應的值name:鍵名;keys:映射鍵名列表
hmset(name, mapping)向鍵為name的散列表中批量添加映射name:鍵名;mapping:映射字典
hincrby(name, key, amount=1)將鍵為name的散列表中映射的值增加amountname:鍵名;key:映射鍵名;amount:增長量
hexists(name, key)鍵為name的散列表中是否存在鍵名為鍵的映射name:鍵名;key:映射鍵名
hdel(name, *keys)在鍵為name的散列表中,刪除鍵名為鍵的映射name:鍵名;keys:映射鍵名
hlen(name)從鍵為name的散列表中獲取映射個數name: 鍵名
hkeys(name)從鍵為name的散列表中獲取所有映射鍵名name:鍵名
hvals(name)從鍵為name的散列表中獲取所有映射鍵值name:鍵名
hgetall(name)從鍵為name的散列表中獲取所有映射鍵值對name:鍵名

8.RedisDump

RedisDump提供了兩個可執行命令:redis-dump用于導出數據,redis-load用于導入數據。

轉載于:https://www.cnblogs.com/Iceredtea/p/11094753.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392998.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392998.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392998.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

創建react應用程序_如何使用React創建一個三層應用程序

創建react應用程序Discover Functional JavaScript was named one of the best new Functional Programming books by BookAuthority!“發現功能JavaScript”被BookAuthority評為最佳新功能編程書籍之一 ! Splitting a Single Page Application into layers has a …

linux update語句,MySQL 多表 update sql語句總結

MySQL 多表 update 有幾種不同的寫法。假定我們有兩張表,一張表為Product表存放產品信息,其中有產品價格列Price;另外一張表是ProductPrice表,我們要將ProductPrice表中的價格字段Price更新為Price表中價格字段的80%。在Mysql中我…

linux延時與定時操作

1、at ---系統延遲任務發起命令 at time >command ---任務指令 >ctrld ---發起任務 at -l ---列出延時任務Id at -r id ---刪除改id任務 at -m ---讓無輸出的命令產生郵件 at -M ---讓有輸…

windows修改PowerShell(命令提示符)默認中文編碼方式

如果以下方法都沒有作用的話&#xff0c;可以直接在代碼中調用<stdlib.h>中的system("mode con cp select65001")或者是system("chcp 65001")。當然&#xff0c;前提是你用的也是C、C、C#等強類型編程語言。 **************************************…

leetcode面試題 17.07. 嬰兒名字(并查集)

每年&#xff0c;政府都會公布一萬個最常見的嬰兒名字和它們出現的頻率&#xff0c;也就是同名嬰兒的數量。有些名字有多種拼法&#xff0c;例如&#xff0c;John 和 Jon 本質上是相同的名字&#xff0c;但被當成了兩個名字公布出來。給定兩個列表&#xff0c;一個是名字及對應…

appium+python+iOS 環境搭建與使用中常見問題的解決方案鏈接

&#xff08;1&#xff09;WebDriverAgent 安裝入門篇&#xff1a;https://www.cnblogs.com/zhanggui/p/9239827.html 重點摘要&#xff1a; 在WDA的Github上也給出了WDA的特性&#xff1a; 1.支持真機 &&模擬器 在模擬器上運行還是比較方便的&#xff0c;在真機上需要…

api工廠接口路徑是什么_為什么(幾乎)永遠不要再使用絕對路徑訪問API

api工廠接口路徑是什么by Vitaly Kondratiev通過維塔利康德拉季耶夫(Vitaly Kondratiev) 為什么(幾乎)永遠不要再使用絕對路徑訪問API (Why you should (almost) never use an absolute path to your APIs again) Recent advances in web apps architecture show that a decou…

雙機通信c語言程序,上傳一個自己編寫的I2C雙機通信程序

本帖最后由 micro_聽海 于 2012-11-24 19:58 編輯這幾天一直在搞AVR的twi(twi就是i2c)雙機通信程序&#xff0c;使用的是兩塊arduino開發板。因為最總要這個通信程序最總是要放在winavr的編譯環境中&#xff0c;所以沒有使用arduino自帶的庫函數。但是這沒關系&#xff0c;因為…

leetcode684. 冗余連接(并查集)

在本問題中, 樹指的是一個連通且無環的無向圖。 輸入一個圖&#xff0c;該圖由一個有著N個節點 (節點值不重復1, 2, …, N) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到N中間&#xff0c;這條附加的邊不屬于樹中已存在的邊。 結果圖是一個以邊組成的二維數組。每一…

Windows Server 2008 部署權限管理RMS

1.1 實戰&#xff1a;部署權限管理 試驗目的&#xff1a; 在單域環境中部署活動目錄權限管理服務&#xff0c;實現文檔的保護。 試驗環境&#xff1a; ? DCServer安裝Windows Server 2008企業版&#xff0c;是ess.com的域控制器&#xff0c;安裝企業CA。 ? RMSServer安裝Wind…

day5 Python爬蟲學習

一 實現京東上的自動搜索并提取信息 from selenium import webdriver # 導入鍵盤Keys from selenium.webdriver.common.keys import Keys import timedriver webdriver.Chrome()# 檢測代碼塊 try:# 隱式等待&#xff0c;等待標簽加載driver.implicitly_wait(10)# 往京東主頁…

虛擬dom添加虛擬dom_虛擬DOM緩慢。 認識記憶化的DOM

虛擬dom添加虛擬domby Sindre Osen Aarsaether通過Sindre Osen Aarsaether 虛擬DOM緩慢。 符合已記憶的DOM。 (The Virtual DOM is slow. Meet the Memoized DOM.) 超越虛擬DOM和狀態管理 (Moving beyond the Virtual DOM and State Management) The virtual DOM was a fantas…

編寫一個字節數的rtu C語言校驗程序,Modbus通信協議中CRC校驗的快速C語言算法

Modbus通信協議中CRC校驗的快速C語言算法2004年第11期            福 建 電 腦  63Modbus通信協議中CRC校驗的快速C語言算法孟開元(西安石油大學計算機學院陜西西安710065)【摘 要】 本文主要討論了Modbus通信協議的RTU幀格式中常用的錯誤校驗方法,即循環冗…

leetcode1319. 連通網絡的操作次數(并查集)

用以太網線纜將 n 臺計算機連接成一個網絡&#xff0c;計算機的編號從 0 到 n-1。線纜用 connections 表示&#xff0c;其中 connections[i] [a, b] 連接了計算機 a 和 b。 網絡中的任何一臺計算機都可以通過網絡直接或者間接訪問同一個網絡中其他任意一臺計算機。 給你這個…

Codeforces 600E Lomsat gelral (樹上啟發式合并)

題目鏈接 Lomsat gelral 占坑……等深入理解了再來補題解…… #include <bits/stdc.h>using namespace std;#define rep(i, a, b) for (int i(a); i < (b); i)typedef long long LL;const int N 600010;int n; int cc[N], col[N], sz[N], son[N]; LL ans[N];vect…

如何讓CloudStack使用KVM創建Windows實例成功識別并掛載數據盤

問題產生背景&#xff1a; 使用CloudStack KVM組合進行資源池納管工作&#xff0c;通過ISO鏡像文件創建了兩個模板&#xff1a; RHEL6U3 64位系統以及WindowsServer2008 R2 SP1 64位系統。然后通過模板創建實例&#xff0c;掛載外接存儲&#xff0c;實例啟動后&#xff0c;通過…

云計算openstack介紹

轉載于:https://www.cnblogs.com/WIU1905/p/11107593.html

C語言Node lt T gt,c語言論壇填空;#includelt;stdio.hgt;# 愛問知識人

填空&#xff1b;#include #include #define N 6typedef struct node {int data;struct node *next;填空&#xff1b;#include #include #define N 6typedef struct node {int data;struct node *next;} NODE;void fun(NODE *h){ NODE *p, *q; int t;/**********found*********…

gitlab設置郵件服務器_如何設置您自己的一次性電子郵件服務器

gitlab設置郵件服務器by Oren Geva由Oren Geva 如何設置您自己的一次性電子郵件服務器 (How To Setup Your Own Disposable Email Server) Disposable email services are online services that provide temporary email addresses for registering or signing up on websites…

leetcode442. 數組中重復的數據

給定一個整數數組 a&#xff0c;其中1 ≤ a[i] ≤ n &#xff08;n為數組長度&#xff09;, 其中有些元素出現兩次而其他元素出現一次。 找到所有出現兩次的元素。 你可以不用到任何額外空間并在O(n)時間復雜度內解決這個問題嗎&#xff1f; 示例&#xff1a; 輸入: [4,3,2…