华为OD机试C卷(100分)-求字符串中所有整数的最小和(C语言)

题目描述

输入字符串s,输出s中包含所有整数的最小和。

说明:

字符串s,只包含 a-z A-Z ± ;
合法的整数包括

1) 正整数 一个或者多个0-9组成,如 0 2 3 002 102
2)负整数 负号 – 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023

输入描述

包含数字的字符串

输出描述

所有整数的最小和

用例

输入 bb1234aa
输出 10
说明 无

输入 bb12-34aa
输出 -31
说明 1+2+(-34) = -31

题目解析

本题看上去很难,其实想清楚三点那就很简单

正数字符串的最小值如何计算?比如1234的最小值是多少,那肯定是1+2+3+4,即每位都是一个独立数,且都是一个小于10的数,它们之和就是最小的。
负数字符串的最小值如何计算?比如-34,那肯定是整体当成一个负数时,最小。
正数负数混合字符串最小值如何计算?比如12-34,那肯定是正数部分12每位单独计算,负数部分当成整体
我的解题思路如下:

定义一个容器negative,用于存储负数的数字字符

定义一个标识isNegative,用来记录是否遇到负数,初始化为false,标识一开始没有遇到负数

遍历输入字符串s的每一个字符c

如果 c == ‘-’,则说明负数要开始了,因此更新isNegative = true
如果 c 是数字字符,则此时需要分情况讨论:
isNegative == false,则此时直接将c字符转成对应的数值合入结果,ans += parseInt©
isNegative == true,则说明c是负数的字符,此时应该将c加入缓存容器negative中
如果 c 是字母字母,若isNegative == true,则需要将negative容器中内容拼接,然后转化为负数合入结果,ans -= parseInt(negative.join(“”)),完成后,将isNeagtive = false,并且清空negative容器。
需要注意的是,当c == ‘-’,也需要注意出现 “-34-40” 这种情况,即 c == ‘-’,也需要先判断isNegative == true,则需要将negative容器中内容拼接,然后转化为负数合入结果,ans -= parseInt(negative.join(“”)),完成后,将isNeagtive = false,并且清空negative容器。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 10000
int main()
{
    char s[Max];
    gets(s);
    int isNegative=0;
    char negative[Max];
    int sizeN=0;
    long long ans=0;
    int i=0;
    while(s[i]!='\0'){
     char c=s[i];
     if(c>='0'&&c<='9'){
         if(isNegative) {
          negative[sizeN++]=c;//负数加入集合
         }
         else{
          ans+=c-'0';
         }
     }else{
          if(isNegative&&sizeN>0) {//计算负数
          ans-=atol(negative);
          memset(negative,'\0',Max);
          sizeN=0;
          }
           isNegative=c=='-';//连续负数,设置负号
     }
     i++;
    }
    if(sizeN>0){
      ans-=atol(negative);//还有剩余负数
    }
    printf("%lld\n",ans);
    return 0;
}


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不会起名字呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值