Leetcode|Reverse Integer(string转char*总结)
2015-07-11 10:05
441 查看
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
解法1:
思路是转化为字符串。溢出的判断要进行字符串比较;这里string类型不能直接用strcmp;如果想用的话,需要类型转换。
下面我会说明到底怎么比较字符串。
int strcmp(const char str1, const char* str2);*
其中str1和str2可以是字符串常量或者字符串变量,返回值为整形。返回结果如下规定:
①str1小于str2,返回负值或者-1;
②str1等于str2,返回0;
③str1大于str2,返回正值或者1;
strcmp函数实际上是对字符的ASCII码进行比较,实现原理如下:首先比较两个字符串的第一个字符,若不相等,则停止比较并得出两个ASCII码大小比较的结果;如果相等就接着比较第二个字符然后第三个字符等等。无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符’\0’为止,就能得出结果。
如果用strcmp,我们将string转换为char .最好是const char.
string转换为char* 有三种方法:
string tmp;
char p=(char)tmp.data();//不加char*问题不大。
char *p=tmp.c_str();
char p[15];tmp.copy(p,tmp.size(),0);p[tmp.size()]=0;//末尾加上’\0’; 下面题目的tmp长度不会超过10个。
直接用string的特性比较(两种方法):
tmp.compare(“2147483649”);返回的是正数,负数和0;
tmp>”2147483649”;返回的true和false;
代码如下:
上题有两点需要注意:
1,判断溢出时候,比较字符串,先确定长度是10。不然输入123也返回0了。
2,INT_MIN变为正数的时候,用unsigned int.
解法2:
直接在int下操作。无需转换字符串。注意溢出条件。
INT_MAX不能随便减去一个负数,INT_MIN 也不能随便减去一个正数。
上面溢出条件其实应该是:
y*10+n>INT_MAX||y*10+n
Example1: x = 123, return 321
Example2: x = -123, return -321
解法1:
思路是转化为字符串。溢出的判断要进行字符串比较;这里string类型不能直接用strcmp;如果想用的话,需要类型转换。
下面我会说明到底怎么比较字符串。
int strcmp(const char str1, const char* str2);*
其中str1和str2可以是字符串常量或者字符串变量,返回值为整形。返回结果如下规定:
①str1小于str2,返回负值或者-1;
②str1等于str2,返回0;
③str1大于str2,返回正值或者1;
strcmp函数实际上是对字符的ASCII码进行比较,实现原理如下:首先比较两个字符串的第一个字符,若不相等,则停止比较并得出两个ASCII码大小比较的结果;如果相等就接着比较第二个字符然后第三个字符等等。无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符’\0’为止,就能得出结果。
如果用strcmp,我们将string转换为char .最好是const char.
string转换为char* 有三种方法:
string tmp;
char p=(char)tmp.data();//不加char*问题不大。
char *p=tmp.c_str();
char p[15];tmp.copy(p,tmp.size(),0);p[tmp.size()]=0;//末尾加上’\0’; 下面题目的tmp长度不会超过10个。
直接用string的特性比较(两种方法):
tmp.compare(“2147483649”);返回的是正数,负数和0;
tmp>”2147483649”;返回的true和false;
代码如下:
int reverse(int x) { string tmp; bool neg=x<0?true:false; unsigned int t=x<0?-x:x;//不能用long long 定义t,否则对于INT_MIN,去相反数仍然为INT_MIN,负号一直有。 stringstream ss; for(;t!=0;t/=10){ char tt=t%10+'0'; ss<<tt; } tmp=ss.str(); if(tmp.size()==10&&(tmp.compare("2147483648")>0||(!neg&&tmp.compare("2147483647")>0))) return 0;//用compare函数 //remove zero int i=0; for(;tmp[i]=='0';i++); int res=0; for(;i<tmp.size();i++){ res=res*10+(tmp[i]-'0'); } return neg?-res:res; }
上题有两点需要注意:
1,判断溢出时候,比较字符串,先确定长度是10。不然输入123也返回0了。
2,INT_MIN变为正数的时候,用unsigned int.
解法2:
直接在int下操作。无需转换字符串。注意溢出条件。
INT_MAX不能随便减去一个负数,INT_MIN 也不能随便减去一个正数。
int reverse(int x){ int y=0; for(;x!=0;x/=10){ int n=x%10; if(y>INT_MAX/10||y<INT_MIN/10) return 0;//减去n就溢出了 y=y*10+n; } return y; }
上面溢出条件其实应该是:
y*10+n>INT_MAX||y*10+n
相关文章推荐
- ffmpeg和opencv 播放视频文件和显示器
- POJ 1028:Web Navigation
- Java经典问题:传值与传引用?
- php常见的面试题目
- webstorm快捷键
- 多线程面试题
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
- day24--多线程案例源码
- linux yum源的配置及使用
- Ubuntu 64 + IntelliJ IDEA + Genymotion 搭建Android开发环境
- CSS鼠标样式整理
- Ubuntu下NAO环境配置
- GridView点击空白地方事件扩展
- Android动画进阶—使用开源动画库nineoldandroids
- Activity 时间监听机制---OnclickListener
- Xcode插件(一)-规范注释生成器VVDocumenter
- POJ 2528 Mayor's posters(线段树+离散化)
- python基础课程_学习笔记20:标准库:有些收藏夹——os
- iOS基础(c)-内存管理
- ubuntu下安装jdk