日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

字符串的求和

發(fā)布時(shí)間:2025/3/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串的求和 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 將整數(shù)字符串轉(zhuǎn)成整數(shù)值{python)
  • 字符串中數(shù)字子串的求和
  • 公式字符串求值
  • 實(shí)現(xiàn)字符串?dāng)?shù)字的減法
  • 基本計(jì)算器(1)
  • 基本計(jì)算器(2)
  • 基本計(jì)算器(3)

一、題目:將整數(shù)字符串轉(zhuǎn)成整數(shù)值{python)

給定一個(gè)字符串str,如果str符合日常書寫的整數(shù)形式,并且屬于32位整數(shù)的范圍,返回所代表的整數(shù)值,否則返回0。
eg
str = “123”,返回123.
str = “023”,因?yàn)椤?23”不符合日常的書寫習(xí)慣,所以返回0.
str = “A23”,返回0;
str = “0”,返回0;
str= “2147483647”,返回2147483647.
str = “2147483648”,因?yàn)橐绯隽?#xff0c;所以返回0;
str = “-123”,返回-123;

思路:

空字符串輸入、正負(fù)符號(hào)、非法字符、整型溢出【最難處理】

  • ?檢查日常書寫,非法字符
    • 第一個(gè)既不是負(fù)號(hào),也不是數(shù)字的情況,如:‘A12’
    • 第一個(gè)是負(fù)號(hào),但是整個(gè)字符串的長(zhǎng)度只有1,或者負(fù)號(hào)后面跟個(gè)0的情況,如‘-“或者”-012“
    • 以0開頭,而且整個(gè)字符串的長(zhǎng)度大于1,如:‘012”
    • 從第二個(gè)開始依次遍歷字符串,一旦出現(xiàn)不是數(shù)字的情況立即返回FALSE
  • 字符轉(zhuǎn)數(shù)字操作
      • 字符串為空或者字符串的長(zhǎng)度為0
      • 字符串中存在不合法的字符
      • 第一個(gè)字符是否為負(fù)號(hào)的情況

    處理整數(shù)溢出:

    當(dāng)發(fā)生溢出時(shí),取最大或最小的int值。即大于正整數(shù)能表示的范圍時(shí)返回MAX_INT:2147483647;小于負(fù)整數(shù)能表示的范圍時(shí)返回MIN_INT:-2147483648。

    我們先設(shè)置一些變量:

    • sign用來處理數(shù)字的正負(fù),當(dāng)為正時(shí)sign > 0,當(dāng)為負(fù)時(shí)sign < 0
    • n存放最終轉(zhuǎn)換后的結(jié)果
    • c表示當(dāng)前數(shù)字

    處理溢出:

    • 如果我們要轉(zhuǎn)換的字符串是"2147483697",那么當(dāng)我掃描到字符'9'時(shí),判斷出214748369 > MAX_INT / 10 = 2147483647 / 10 = 214748364(C語言里,整數(shù)相除自動(dòng)取整,不留小數(shù)),則返回0;
    • 如果我們要轉(zhuǎn)換的字符串是"2147483648",那么判斷最后一個(gè)字符'8'所代表的數(shù)字8與MAX_INT % 10 = 7的大小,前者大,依然返回0。

    代碼:

    #判斷是否為合法 def isValid(s):if s[0] != '-' and not s[0].isdigit():return Falseelif s[0] == '-' and (len(s) == 1 or s[1] == '0'):return Falseelif s[0] == '0' and len(s) > 1:return Falsefor i in range(len(s)):if not s[i].isdigit():return Falsereturn True def convert(s):#判斷為空if not s:return 0if not isValid(s):return 0sign = -1 if s[0] == '-' else 1q = 214748364 #-2^31 // 10maxr = 7res , cur = 0 , 0 start = 0 if sign == 1 else 1for i in range(start,len(s)): cur = int(s[i])if res > q or res == q and cur > maxr:return 0res = res * 10 + cur if sign and res == 2147483648:return 0return res * sign s = '2147483637' convert(s)

    二、字符串中數(shù)字子串的求和

     給定一個(gè)字符串str,求其中全部數(shù)字串所代表的數(shù)字之和

      1. 忽略小數(shù)點(diǎn),“ A1.3 ” 表示的數(shù)字就是包含兩個(gè)數(shù)字 1 和 3

      2. 緊貼數(shù)字的左邊出現(xiàn) “-”,其連續(xù)出現(xiàn)的數(shù)量如果為奇數(shù),就視為 負(fù),如果為偶數(shù),就視為 正 “ A-1BC--23” 表示的是 -1 和 23

    思路:時(shí)間復(fù)雜度是O(N),空間復(fù)雜度是O(1)

    首先定義三個(gè)變量, res表示目前的累加和,num表示當(dāng)前收集到的數(shù)字,布爾型變量flag表示將num加到res中,num是正還是負(fù).

    代碼:

    def numSum(arr):if not arr:return 0num , res = 0 , 0flag = 1i = 0while i < len(arr):while i < len(arr) and arr[i] == '-':flag *= -1i += 1while i<len(arr) and arr[i].isdigit():num = num*10 + int(arr[i])i += 1if i<len(arr) and not arr[i].isdigit():i += 1if num:res += flag*num num ,flag = 0 , 1return res arr = 'A1.3' numSum(arr) a="A-1BC--23" numSum(a)

    三、題目:公式字符串求值

    思路:采用棧存儲(chǔ)數(shù)字和加減符號(hào),乘除在放入棧中已計(jì)算出結(jié)果。變量pre記錄數(shù)字。括號(hào)就遞歸。

    1、遇到數(shù)字:采用pre變量保存。

    2、遇到符號(hào):存入棧中,存入之前先把棧中的乘除結(jié)果算出來

    3、遇到左括號(hào):遞歸計(jì)算

    4、遇到右括號(hào):計(jì)算棧中的結(jié)果。

    ?

    五、題目:基本計(jì)算器【只有 + ,- ,以及括號(hào)】

    實(shí)現(xiàn)一個(gè)基本的計(jì)算器來計(jì)算一個(gè)簡(jiǎn)單的字符串表達(dá)式的值。

    字符串表達(dá)式可以包含左括號(hào)?(?,右括號(hào)?),加號(hào)?+?,減號(hào)?-,非負(fù)整數(shù)和空格??。

    示例 1:

    輸入: "1 + 1" 輸出: 2

    示例 2:

    輸入: " 2-1 + 2 " 輸出: 3

    示例 3:

    輸入: "(1+(4+5+2)-3)+(6+8)" 輸出: 23

    非遞歸思路:

    棧:

    采用棧存儲(chǔ)遇到 ( 之前的結(jié)果。

    遇到 ),將棧中最后一個(gè)數(shù)彈出計(jì)算結(jié)果。

    處理過程:

    res記錄結(jié)果,stack用來存結(jié)果【遇到()先存前面的結(jié)果】,sign記錄符號(hào)+、-

  • 遇到 + :sign = 1
  • 遇到 - :sign = -1
  • 遇到數(shù)字:【考慮‘42’兩個(gè)字母一起的情況,采用循環(huán)】結(jié)果 res? += int (42) * sign
  • 遇到 ’( ’:stack中加入 res和sign
  • 遇到‘ ) ‘:stack彈出最后一個(gè)元素和倒數(shù)第二個(gè)元素來更新res
  • ?

    代碼1:

    def calculate(self, s):""":type s: str:rtype: int"""if not s:return 0 #stack存儲(chǔ)遇到括號(hào)(之前的計(jì)算結(jié)果res #temp記錄數(shù)字,【如‘42’兩個(gè)數(shù)字一起出現(xiàn)的情況】 #sign記錄符號(hào)+,- #res記錄計(jì)算結(jié)果stack,temp = [],''sign , res , i = 1 , 0 , 0 while i < len(s): #遇到字母:如果有兩個(gè)數(shù)字同時(shí)出現(xiàn),采用循環(huán)解決 #res結(jié)果把符號(hào)相乘if s[i].isdigit():while i<len(s) and s[i].isdigit():temp += s[i]i += 1i -= 1res += int(temp)*sign #遇到+,-,sign=1,-1elif s[i] == '+':sign = 1elif s[i] == '-':sign = -1 #遇到(,將前面的res和符號(hào)sign存入棧中,初始化res和signelif s[i] == '(':stack.append(res)stack.append(sign)res,sign = 0,1 #遇到),將棧中原來的結(jié)果res和符號(hào)sign彈出和當(dāng)前的res更新得到新的結(jié)果reselif s[i] == ')':if stack:sign_tmp = stack.pop()res_tmp = stack.pop()res = res_tmp + res*sign_tmpi += 1temp= ''return res

    六、題目:基本計(jì)算器二【只有加減乘除,沒有括號(hào)】

    實(shí)現(xiàn)一個(gè)基本的計(jì)算器來計(jì)算一個(gè)簡(jiǎn)單的字符串表達(dá)式的值。

    字符串表達(dá)式僅包含非負(fù)整數(shù),+, - ,*,/ 四種運(yùn)算符和空格??。 整數(shù)除法僅保留整數(shù)部分。

    示例?1:

    輸入: "3+2*2" 輸出: 7

    示例 2:

    輸入: " 3/2 " 輸出: 1

    示例 3:

    輸入: " 3+5 / 2 " 輸出: 5

    非遞歸思路1:

    • 遇到數(shù)字:num存儲(chǔ)
    • 遇到符號(hào):
  • +:棧存儲(chǔ):+num
  • -:棧存儲(chǔ):-num
  • *:num = 棧彈出最后一個(gè)元素 * num,再存入棧中
  • /:num = 棧彈出最后一個(gè)元素 / num,再存入棧中
  • 如:'45/9',先num = 45,然后45前面默認(rèn)為+ 符號(hào),將45存入棧中,然后 sign =? / ,num = 9,判斷sign == '/',將45彈出與num==9相除。

    即每個(gè)數(shù)字與其前面的符號(hào)相對(duì)應(yīng),sign和num。

    代碼1:

    def calculate(self, s):if not s:return "0" stack, num, sign = [], 0, "+" for i in range(len(s)): if s[i].isdigit(): num = num*10+ord(s[i])-ord("0") if (not s[i].isdigit() and not s[i].isspace()) or i == len(s)-1: if sign == "-": stack.append(-num) elif sign == "+": stack.append(num) elif sign == "*": stack.append(stack.pop()*num) else: tmp = stack.pop() if tmp//num < 0 and tmp%num != 0: stack.append(tmp//num+1) else: stack.append(tmp//num) sign = s[i] num = 0 return sum(stack)

    非遞歸思路2:

    棧:

    • 遇到數(shù)字:就將數(shù)字存入棧中?!究紤]兩個(gè)數(shù)字一起出現(xiàn)的情況】
    • 遇到 * 或 / 就將乘或者除計(jì)算結(jié)束再存入棧中?!酒渲羞€要考慮是數(shù)字的情況】
      • 將棧最后一個(gè)元素彈出,然后與 【乘號(hào)或者除號(hào)后面一個(gè)元素的數(shù)字】進(jìn)行計(jì)算得到新的結(jié)果再存進(jìn)棧中
    • 遇到加減,sign = 1或-1

    結(jié)果:

    將棧中所有元素加總就可以了

    代碼2:

    def calculate(self, s):""":type s: str:rtype: int"""if not s:return 0# return eval(s)stack = []res,sign,i= 0,1,0num = ''ca = Truewhile i < len(s):ss = s[i] #數(shù)字,考慮兩個(gè)數(shù)字出現(xiàn)的情況,用循環(huán)if ss.isdigit():while i<len(s) and s[i].isdigit():num += s[i]i += 1ca = Falsestack.append(int(num)*sign) #加減sign = 1或者-1elif ss == '+':sign = 1elif ss == '-':sign = -1 #乘號(hào),elif ss == '*':#可能后面是空白符號(hào)while not s[i].isdigit():i += 1#考慮兩個(gè)數(shù)字一起出現(xiàn)while i<len(s) and s[i].isdigit():num += s[i]i += 1ca = False#將棧最后一個(gè)元素和乘號(hào)*后面一個(gè)數(shù)字相乘res = stack.pop() * int(num)#將結(jié)果存入棧中stack.append(res) #除號(hào)elif ss == '/':value = stack.pop()while not s[i].isdigit():i += 1while i<len(s) and s[i].isdigit():num += s[i]i += 1ca = False#m是用來限制除法取整的,如果除的結(jié)果是負(fù)數(shù),則結(jié)果要加1,正數(shù)不用m = value//int(num)if value % int(num) != 0:m += 1 if m < 0 else 0#將除的結(jié)果加入棧中res = int(m)stack.append(res)if ca:i += 1num , ca = '',Truereturn sum(stack)

    ?


    七、題目:基本計(jì)算器三【既有乘除又有括號(hào)】

    ?

    這道題將一和二結(jié)合,就是遇到括號(hào)就遞歸,別的就都與題目二一樣。

    思路:采用棧存儲(chǔ)數(shù)字和加減符號(hào),乘除在放入棧中已計(jì)算出結(jié)果。變量pre記錄數(shù)字。括號(hào)就遞歸。

    1、遇到數(shù)字:采用pre變量保存。

    2、遇到符號(hào):存入棧中,存入之前先把棧中的乘除結(jié)果算出來

    3、遇到左括號(hào):遞歸計(jì)算

    4、遇到右括號(hào):計(jì)算棧中的結(jié)果。

    def getValue(s):if not s:return 0return value(list(s),0)[0] #遞歸函數(shù),遇到左括號(hào) def value(arr,i):deque = []pre = 0while i < len(arr) and arr[i] != ')':#如果是數(shù)字,用pre變量保存if arr[i].isdigit():pre = pre * 10 + int(arr[i])i += 1#如果是符號(hào),加入棧中,但先要把棧中的乘除結(jié)果算出來。elif arr[i] != '(':mulNum(deque,pre)deque.append(arr[i])i += 1pre = 0#如果是左括號(hào)(,就遞歸。else:bra = value(arr,i+1)pre = bra[0]i = bra[1] + 1#如果是右括號(hào))或者結(jié)束了,就求出最終結(jié)果。mulNum(deque,pre)return [addNum(deque),i] #乘除法計(jì)算 def mulNum(deque,pre):if deque:last = deque.pop()if last == '+' or last == '-':deque.append(last)else:cur = int(deque.pop())pre = pre * cur if last == '*' else cur / predeque.append(pre) #加減法計(jì)算 def addNum(deque):res = 0sign = 1while deque:cur = deque.pop(0)if cur == '-':sign = -1elif cur == '+':sign = 1else:res += sign * int(cur)return res exp = '48*((70-65)-43)+8*1*3+5/5' getValue(exp)

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/Lee-yl/p/10462757.html

    總結(jié)

    以上是生活随笔為你收集整理的字符串的求和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。