首页  >  文章  >  后端开发  >  给定一个字符串,求其中连续数字所组成的数的总和

给定一个字符串,求其中连续数字所组成的数的总和

王林
王林转载
2023-08-28 09:17:14658浏览

给定一个字符串,求其中连续数字所组成的数的总和

问题陈述

We have given a string str containing the numeric and alphabetical characters. We need to find the sum of all numbers represented by a continuous sequence of digits available in the given string.

示例示例

Input

str = “12were43”

输出

55

Explanation

The sum of 12 and 43 is equal to 55.

Input

str = “1a2c3d”

输出

6

Explanation

1、2和3的和为6。

Input

str = “werderfrewsf”

输出

0

Explanation

It gives 0 in the output as the string contains no digit.

我们解决问题的逻辑是从给定的字符串中提取所有数字并求和。

方法一

In this approach, we will use isDigit() method to check whether the current character is a digit. Also, we multiply the current value of the number by 10 and add the current character to the number if the current character is a digit.

算法

  • 步骤 1 - 将 'number' 和 'sum' 变量初始化为零。

  • Step 2 − Iterate through the string and check current character is between 0-9 using the isDigit() method.

  • 步骤 3 - 如果当前字符是数字,则将数字值乘以10,并加上当前数字值。

  • 第四步 - 如果当前字符不是数字,则将“number”变量的值添加到“sum”变量中,并将“number”变量的值更新为零。

  • Step 5 − Once the iteration of the loop completes, add the value of the ‘number’ to the ‘sum’ variable and return the value of the sum variable.

Example

#include <bits/stdc++.h>
using namespace std;
// function to return the sum of the consecutive number present in the string
int getSumOfDigits(string str){
   // store the current number
   int number = 0;
   // Stores total sum
   int sum = 0;
   // Traverse the string
   for (auto &ch : str){
      // If the current character is between '0' and '9', append it to the number
      if (isdigit(ch)) {
         number = number * 10 + ch - '0';
      } else {
         // 	if the current character is not between '0' and '9', add 'number' to the sum and reset 'number'
         sum += number;
         number = 0;
      }
   }
   // if the number is greater than 0, add it to sum
   sum += number;
   return sum;
}
int main(){
   string str = "6we24er5rd6";
   cout << "The sum of consecutive digits in the given string is - " << getSumOfDigits(str);
   return 0;
}

输出

The sum of consecutive digits in the given string is - 41
  • 时间复杂度 - O(n),因为我们只使用了一个循环。

  • 空间复杂度 − O(1),因为我们不使用任何额外的空间。

Approach 2

In this approach, we use the ASCII values of the character to check whether the current character is a digit. Also, we append characters to the ‘number’ variable until we get digits in the string and use the atoi() method to extract the number from the string.

算法

  • 步骤1 - 定义'number'变量并将其初始化为空字符串。同时,定义'sum'变量并将其初始化为0。

  • Step 2 − Use for loop to traverse the string and get each character of the string.

  • 步骤 3 - 如果 c-‘0’ 大于等于零且小于等于 9,则表示当前字符是一个数字。

  • Step 4 − If the current character is a digit, append it to the ‘number’ string.

  • Step 5 − If the current character is not a digit, use the c_str() method to convert the number string to a character array and pass it as a parameter of the atoi() method to convert the string to a number. Also, update the number string with the “” value.

    The atoi() method returns a number if the string is convertible to a number; Otherwise, it returns zero.

  • Step 6 − Once the iteration of for loop completes, again use the atoi() method to convert the string to a number and add to the sum value.

Example

#include <bits/stdc++.h>
using namespace std;
// function to return the sum of the consecutive numbers present in the string
int getSumOfDigits(string str){
   string number = "";
   // to store the sum of all the consecutive numbers
   int sum = 0;
   // traverse the string
   for (char c : str){
      // if the current character is between 0 to 9
      if (c - '0' >= 0 && c - '0' <= 9){
         // append it to the number string
         number += c;
      }
      // if the current character is an alphabet
      else {
         // convert string to an array of characters and pass it to atoi() function
         sum += atoi(number.c_str());
         // reset temporary string to empty
         number = "";
      }
   }
   // if the number is greater than 0, add it to sum
   sum += atoi(number.c_str());
   return sum;
}
int main(){
   string str = "11aa32bbb5";
   cout << "The sum of consecutive digits in the given string is - " << getSumOfDigits(str);
   return 0;
}

输出

The sum of consecutive digits in the given string is - 48
  • 时间复杂度 - O(N)

  • 空间复杂度 − O(1)

方法三

在这种方法中,我们使用正则表达式来找到所有数字的匹配项。之后,我们可以将字符串转换为数字并将其添加到sum变量中。

算法

  • Step 1 − Define the regex pattern.

  • Step 2 − Use the regex_search() method to find the match for the number string.

  • Step 3 − Make iterations using a while loop as long as we find matches.

  • Step 4 − In the while loop, use the stoi() method to convert the string to a number and add it to the sum variable.

  • 第5步 - 同样,使用match().suffix()方法更新字符串。这样我们就不会得到重复的匹配。

Example

#include <bits/stdc++.h>
using namespace std;
// Function to calculate the sum of the numbers found in the string
int getSumOfDigits(string str){
   // regex pattern to find the numbers in the string
   regex pattern("d+");
   smatch match;
   // variable to store the sum of the numbers
   int sum = 0;
   // using the regex_search() function to find the numbers
   while (regex_search(str, match, pattern)){
      // adding the numbers to the sum variable
      sum += stoi(match[0].str());
      // update the string
      str = match.suffix().str();
   }
   return sum;
}
int main(){
   // input alphanumeric string
   string str = "abc23@12";
   cout << "The sum of consecutive digits in the given string is - " << getSumOfDigits(str);
   return 0;
}

输出

The sum of consecutive digits in the given string is - 0
  • Time complexity − O(N), as regex finds matches by iterating through the string.

  • 空间复杂度 − O(1)

Conclusion

我们学习了三种不同的方法来找到字符串中连续数字的和。最后一种方法是最优化的代码,因为它使用了正则表达式。然而,对于初学者来说,使用正则表达式可能会很困难。

以上是给定一个字符串,求其中连续数字所组成的数的总和的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:tutorialspoint.com。如有侵权,请联系admin@php.cn删除