1.整数反转
解题思路
数值的范围(重点)
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为
[−2^31,2^31-1]
。也就是说我们不能用
long
存储最终结果,而且有些数字可能是合法范围内的数字,但是反转过来就超过范围了。
class Solution {
public int reverse(int x) {
int res = 0;
while (x != 0) {// x!=0可以一直循环
// 末位数取mod
int tmp = x % 10;
// 判断是否大于最大32位整数
// 提前对之前的八位进行判断
// res是翻转的数,如果前面的已经大于之前的位数了,显然不用进行判断了
// 如果之前的数都是小于范围的,我们只需要判断个位数
if (res > 214748364 || (res == 214748364 && tmp > 7)) {
return 0;
}
// 判断是否小于最小32位整数
if (res < -214748364 || (res == -214748364 && tmp < -8)) {
return 0;
}
res = res * 10 + tmp;
x = x / 10;// 不要最末尾的数了
}
return res;
}
}
2.字符串转成整数(atoi)
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数。
方法 1:字符串的转换
Character.isDigit()方法:
Character.isDigit( c ),其中c是字符,这个方法可以用于判断字符c是不是数字形式的字符。
// 字符转数字
// 先把字符转为字符串,再转换为数字
char ch = '5';
String temp = String.valueOf(ch);
int a = Integer.parseInt(temp);
System.out.println(a);
//或者
int a = ch - '0';
class Solution {
public int myAtoi(String s) {
int sign=1;
int res=0;
int m=s.length();
int i=0;
while(i<m&&s.charAt(i)==' '){//循环停止的条件,此时略过前面的空格
i++;
}
int start=i;
for(;i<m;i++){
char c=s.charAt(i);
//判断符号,为“正负”的情况
//只有其在首位置才是有效的,否则直接退出
if(i==start&&c=='+'){
sign=1;//符号
}else if(i==start&&c=='-'){
sign=-1;
}else if(Character.isDigit(c)){
int num=c-'0';
//和上题差不多的步骤,需要进行判断
if(res>Integer.MAX_VALUE/10||(res==Integer.MAX_VALUE/10&&num>Integer.MAX_VALUE%10)){
return Integer.MAX_VALUE;
}
//最小值
if(res<Integer.MIN_VALUE/10||(res==Integer.MIN_VALUE/10&&-num<Integer.MIN_VALUE%10)){
return Integer.MIN_VALUE;
}
res=num*sign+res*10;
}else{
break;
}
}
return res;
}
}
3.回文数
给你一个整数
x
,如果x
是一个回文整数,返回true
;否则,返回false
。回文数
是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
方法1:反转一半
class Solution {
public boolean isPalindrome(int x) {
//1.当x<0时,bushihuiwenshu
// 同样地,如果数字的最后一位是 0,为了使该数字为回文,
// 则其第一位数字也应该是 0
// 只有 0 满足这一属性
if(x<0||(x%10==0&&x!=0)){
return false;
}
//整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,
//所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。
int reversenumber=0;
while(reversenumber<x){
reversenumber=reversenumber*10+(x%10);
x=x/10;
}
// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x==reversenumber||x==reversenumber/10;
}
}
方法2:回文字符串(cool)
class Solution4 {
public boolean isPalindrome(int x) {
String str=String.valueOf(x);
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append(str);
return str.equals(stringBuffer.reverse().toString());
}
}
4.盛最多水的容器
方法一:暴力求解法
//可以运行出来但是超时了
class Solution {
public static int maxArea(int[] height) {
// 1.可以分为两拨进行遍历
// 计算数组的大小
int len = height.length;
int left = 0;
int right = len - 1;
int areasave = 0;
// 开始计算面积
for (left = 0; left < right; left++) {
for (right = len - 1; left < right; right--) {
// 表示总长度
int row = right - left;
int area = row * Math.min(height[left], height[right]);
if (areasave < area) {
areasave = area;
}
}
right = len - 1;
}
return areasave;
}
}
方法二:双指针法
class Solution {
public static int maxArea(int[] height) {
//双指针法
int l=0;
int r=height.length-1;
int ans=0;
while(l<r){
int area=Math.min(height[l],height[r])*(r-l);
ans=Math.max(ans,area);
if(height[l]<height[r]){
l++;
}else{
r--;
}
}
return ans;
}
}
5.整数转罗马数字
题目链接:12. 整数转罗马数字 - 力扣(LeetCode)
class Solution {
public static String intToRoman(int num) {
int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
String[] symbols = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < values.length; i++) {
// 对原有的数字进行除法运算,若除不了,则说明没有对应的字符
// 进行下一次遍历即可
// 如果可以相除,我们就添加字符串
int len = num / values[i];
if (len >= 1) {
for (int j = 0; j < len; j++) {
stringBuffer.append(symbols[i]);
}
// 此时数字需要更新
num = num - len * values[i];
}
}
return stringBuffer.toString();
}
}
借鉴了该作者的思路