首页 > 试题广场 >

将整数字符串转成整数值

[编程题]将整数字符串转成整数值
  • 热度指数:2786 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数范围,返回str代表的整数值,否则返回0。

输入描述:
输出包括一行代表str


输出描述:
输出一行,代表返回的值。
示例1

输入

123

输出

123
示例2

输入

023

输出

0
示例3

输入

A13

输出

0
示例4

输入

2147483647

输出

2147483647
示例5

输入

2147483648

输出

0
示例6

输入

-127

输出

-127

备注:
时间复杂度,空间复杂度
运行时间:6ms
超过100.00%用Java提交的代码
占用内存:10792KB
超过58.68%用Java提交的代码


import java.io.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        String str = sc.readLine();
        System.out.println(convert(str));
    }
    
    
    public static int convert(String str){
        if(str==null||str.equals("")){
            return 0;
        }
        char[] chars2 = str.toCharArray();
        if(!isValid(str)){
            return 0;
        }
        int pos = chars2[0]=='-'? -1:1;
        int res = 0;
        int minq = Integer.MIN_VALUE/10;
        int minr = Integer.MIN_VALUE%10;
        int cur = 0;
        for( int i = pos==-1? 1:0;i<chars2.length;i++){
            cur = '0' - chars2[i];
            if(res<minq){
                return  0;
            }
            else if(res==minq && cur<minr){
                return  0;
            }
            else{
                res =res*10 + cur ;
            }
        }
        if(pos==1&&res==Integer.MIN_VALUE){
            return 0;
        }
        
        return pos==-1? res:-res;
        
    }
    
    public static boolean isValid(String str){
        char[] chars1 = str.toCharArray();
        if(chars1[0]!='-'&&(chars1[0]<'0'||chars1[0]>'9')){
            return false;
        }
        if(chars1[0]=='-'&&(chars1.length==1||chars1[1]=='0')){
            return false;
        }
        
        if(chars1[0]=='0'&&chars1.length>1){
            return false;
        }
        
        for(int i =1;i<chars1.length;i++){
            if(chars1[i]<'0'||chars1[i]>'9'){
                return false;
                
            }
        }
        return true;
    }
}



发表于 2021-03-24 11:12:47 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    string s;
    cin>>s;
    int l = s.length(), t=0;
    if(s[0]=='-')
        t = 1;
    for(int i=t;i<l;i++)
        if(!isdigit(s[i])){
            puts("0");
            return 0;
        }
    if(s[t]=='0'){
        puts("0");
        return 0;
    }
    if(t==0){
        if(l>10 || (l==10 && s>"2147483647")){
            puts("0");
            return 0;
        }
    }else{
        if(l>11 || (l==11 && s>"-2147483648")){
            puts("0");
            return 0;
        }
    }
    puts(s.c_str());
    return 0;
}

发表于 2020-04-13 02:22:44 回复(0)
import java.io.*;


public class Main {
    private static final int MIN_Q = Integer.MIN_VALUE / 10;
    private static final int MIN_R = Integer.MIN_VALUE % 10;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        System.out.println(myAtoi(str));
    }

    private static int myAtoi(String s) {
        char[] chs = s.toCharArray();
        int len = chs.length;
        int sign = 1;
        int num = 0;
        int i = 0;

        if (chs[0] != '-' && (chs[0] < '0' || chs[0] > '9')) {
            return 0;
        }
        if (chs[0] == '-' && (len == 1 || chs[1] == '0')) {
            return 0;
        }
        if (chs[0] == '0' && len > 1) {
            return 0;
        }

        if (chs[i] == '-') {
            sign = -1;
            ++i;
        }

        while (i < len) {
            int cur = '0' - chs[i];
            if (cur < -9 || cur > 0) {
                return 0;
            }

            if (num < MIN_Q || (num == MIN_Q && cur < MIN_R)) {
                return 0;
            }

            num = num * 10 + cur;
            ++i;
        }

        if (sign == 1 && num == Integer.MIN_VALUE) {
            return 0;
        }

        return -(sign * num);
    }
}

编辑于 2024-03-04 11:01:46 回复(0)
为了能AC,不择手段了。
代码写的又臭又长,毫无逻辑,没有任何参考性。
为了通过而取范围,暴力取值,通过就是解气。
啥也不是
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char a[1000000];
    while (gets(a))
    {
        int i,f=1;
        if(a[0]=='0'||a[0]<'-'||(a[0]>'-'&&a[0]<'0')||a[0]>'9') 
        {
        	printf("0\n");
        	continue;
		}
        for(i=1;i<strlen(a);i++)
        {
            if(a[i]<'0'||a[i]>'9')
            {
                printf("0\n");
                f=0;
                break;
            }
        }
        if((strlen(a)==10&&a[0]>='2'&&a[9]>='8')||(strlen(a)>=11&&a[0]!='-')||(strlen(a)>11)||(strlen(a)==11&&a[1]>='2'&&a[10]>='9'))
        {
        	printf("0\n");
        	continue;
		}
        if(f==1) printf("%d\n",atoi(a));
    }
    return 0;
}


发表于 2021-10-01 18:03:08 回复(0)
# include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin >> s;
    int n = s.size();
    if (n == 0){
        cout << 0 << endl;
        return 0;
    }
    int flag = 1;
    int i = 0;
     if (s[0] == '-'){
            i ++;
            flag = -1;
      }
    long sum = 0;
    for (; i < n; i ++){
        if (! isdigit(s[i]) || (s[i] == '0' && sum == 0)){
             cout << 0 << endl;
              return 0;
        }
        sum = sum * 10 + (s[i] - '0');
    }
    sum = flag * sum;
    if (sum > INT_MAX || sum < INT_MIN){
         cout << 0 << endl;
        return 0;
    }
    cout << sum << endl;
    return 0;
}
发表于 2021-07-06 15:49:34 回复(0)
#include <iostream>
#include <math.h>
using namespace std;

static int minValue = -pow(2, 31);

bool isValid(const string &str){
    if(str[0] != '-' && (str[0] < '0' || str[0] > '9'))
        return false;
    if(str[0] == '-' && (str.size() == 1 || str[1] == '0'))
        return false;
    if(str[0] == '0' && str.size() > 1)
        return false;
    for(int i = 1; i < str.size(); i++){
        if(str[i] < '0' || str[i] > '9')
            return false;
    }
    return true;
}

int getValue(const string &str){
    if(!isValid(str))
        return 0;
    int mark = str[0] == '-' ? 1 : 0;
    int res = 0;
    int cur = 0;
    int minq = minValue / 10;
    int minr = minValue % 10;
    for(int i = mark; i < str.size(); i++){
        cur = '0' - str[i];
        if(res < minq || (res == minq && cur < minr))
            return 0;
        res = res * 10 + cur;
    }
    if(mark == 0 && res == minValue)
        return 0;
    return mark == 0 ? -res : res;
}

int main(void){
    string str;
    cin >> str;
    cout << getValue(str) << endl;
    return 0;
}

遇到的问题如下:
判断是否合法:
第一种: 第一个字符不是"-", 且第一个字符不在"0", "9"间
第二种:第一个字符是"-",且只有它一个 或 第二个字符是0
第三种:第一个字符是0, 且字符个数大于1个
第四种:从第二个字符开始判断是否在‘0’, ‘9’间

用负值判断 
先用最大负值 minValue / 10 minValue % 10来判断
编辑于 2021-04-21 19:57:26 回复(0)
取巧的解法
#include <bits/stdc++.h>
using namespace std;
int main() {
	char str[205],s[205];
	scanf("%s",str);
	int n;
	sscanf(str,"%d",&n);
	sprintf(s,"%d",n);
	if(strcmp(s,str)==0)printf("%d\n",n);
	else puts("0");
	return 0;
}


发表于 2020-04-10 20:42:50 回复(0)
#include<iostream>
#include<string>
#include<algorithm>
 
using namespace std;

int main() {
    string s;
    cin >> s;
    if(s.find_first_not_of("-0123456789") != string::npos || s[0] == '0' || (s[0] == '-' && s[1] == '0')){
        cout << 0;
        return 0;
    }
    if(s[0] != '-'){
        if((s.length() == 10 && s > "2147483647") || (s.length() > 10)){
            cout << 0;
            return 0;
        }
    }
    if(s[0] == '-'){
        if((s.length() == 11 && s > "-2147483648") || (s.length() > 11)){
            cout << 0;
            return 0;
        }
    }
    cout << stoi(s);
    return 0;
}


编辑于 2020-01-13 21:58:22 回复(0)
import re
a = input()
if re.findall('\D', a) and not re.match('-', a):
    print(0)
else:
    try:
        if eval(a) < 0:
            if eval(a[1:]) > 2**31:
                print(0)
            else:
                print(eval(a))
        elif eval(a) > 2**31-1:
            print(0)
        else:
            print(eval(a))
    except:
        print(0)

发表于 2020-01-03 21:51:27 回复(0)
def solution(string,n):
    new_string = ''
    if string[0] == '-':
        new_string += '-'
    elif not string[0].isdigit() or string[0] == '0' or string[0] == '-' and string[1] == '0':
        return 0
    else:
        new_string += string[0]
    for i in range(1,n):
        if not string[i].isdigit():
            return 0
        new_string += string[i]
    integer = int(new_string)
    if integer >= - 2**31 and integer <= 2**31 - 1:
        return integer
    else:
        return 0

if __name__ == '__main__':
    string = input()
    n = len(string)
    print(solution(string,n))

发表于 2019-09-24 11:21:52 回复(0)

问题信息

上传者:小小
难度:
10条回答 2213浏览

热门推荐

通过挑战的用户

查看代码