7. Integer reverso
Dado um inteiro de 32-bit, os dígitos de um número inteiro reversa.
Exemplo 1:
Entrada: 123
de saída: 321
Exemplo 2:
Entrada: -123
saída: -321
Exemplo 3:
entrada 120
de saída: 21
Exemplo 4:
Entrada: 1534236469
Saída: 0
Nota:
Suponha que estamos lidando com um ambiente que só pode armazenar números inteiros dentro do intervalo inteiro assinado de 32 bits: [-2 ^ 31, 2 ^ 31-1]. Para efeitos deste problema, suponha que a função retorna 0 quando o número inteiro invertida transborda.
//Solution
//总结:%就可以得到余数,得到的余数也可为负数;注意Note中的范围判断
int reverse(int x){
long long t = x,t1 = 0;
while (t)
{
t1 = 10 * t1 + (t%10);
t= t/10;
}
if(t1 <INT_MIN ||t1>INT_MAX) return 0;
return t1;
}
9. Número Palindrome
Determinar se um inteiro é um palindroma. Um inteiro é um palíndromo quando se lê o mesmo para trás como para a frente.
Exemplo 1:
Entrada: 121
de saída: verdadeiro
Exemplo 2:
Entrada: -123
saída: false
Explicação: Da esquerda para a direita, ele lê -121. Da direita para a esquerda, torna-se 121-. Portanto, não é um palíndromo.
Exemplo 3:
Entrada: 10
de saída: false
Explicação: Lê 01 da direita para a esquerda. Portanto, não é um palíndromo.
//Solution
//总结:最中间的数字不重要,所以只要求两边的数字相等即可。
bool isPalindrome(int x){
if(x<0 || (x%10==0 && x!=0)) return false;
int backnum = 0;
int temp;
while (x > backnum)
{
backnum = backnum *10 +x%10;
x /=10;
}
return (x==backnum||x==backnum/10);
}
Acompanhamento:
Coud você resolvê-lo sem converter o inteiro para uma string?
//Solution
//总结:将int转化为字符串,再通过两端进行比对。
class Solution {
public boolean isPalindrome(int x) {
String str = String.valueOf(x);
int start = 0;
int end = str.length()-1;
while(start <end )
{
if(str.charAt(start++) != str.charAt(end--) ) return false;
}
return true;
}
}
13. Roman para Integer
Algarismos romanos são representadas por símbolos de sete diferentes: I, V, X, L, C, D e M.
Símbolo Valor
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
Por exemplo, dois é escrito como II em numeral romano , apenas dois one somados. Doze é escrito como, XII, o qual é simplesmente X + II. O número vinte e sete é escrito como XXVII, que é XX + V + II.
Algarismos romanos são escritos geralmente maior para a menor, da esquerda para a direita. No entanto, o numeral de quatro não é IIII. Em vez disso, o número quatro é escrito como IV. Porque a um é antes de os cinco que subtrai-lo a fazer quatro. O mesmo princípio se aplica ao número nove, que é escrito como IX. Existem seis casos em que é utilizado subtração:
I podem ser colocados antes de V (5) e X (10) para fazer 4 e 9.
X pode ser colocada antes de L (50) e C (100) para fazer 40 e 90.
C pode ser colocada antes de D (500) e M (1000) para fazer 400 e 900.
Dado um numeral romano, convertê-lo para um número inteiro. A entrada é garantida para estar dentro do intervalo de 1 a 3999.
Exemplo 1:
Entrada: “III”
de saída: 3
Exemplo 2:
entrada: “IV”
de saída: 4
Exemplo 3:
entrada: “IX”
de saída: 9
Exemplo 4:
Entrada: “LVIII”
de saída: 58
Explicação: L = 50, V = 5, III = 3.
Exemplo 5:
Entrada: “MCMXCIV”
Saída: 1994
Explicação: M = 1000, CM = 900, XC = 90 e IV = 4.
//Solution
//总结:罗马数字转换成整数的规则如下:如果前一个数的值小于后一个数的值
//那么这个数为后者减去前者。如果前者大于后者,那么就是简单地相加即可。
int valueofnum(char s)
{
int sum;
if(s == 'I') sum =1;
if(s == 'V') sum =5;
if(s == 'X') sum =10;
if(s == 'L') sum =50;
if(s == 'C') sum =100;
if(s == 'D') sum =500;
if(s == 'M') sum =1000;
return sum;
}
int romanToInt(char * s){
int length = strlen(s);
int i ;
int sum = 0;
int t1,t2;
for(i = 0 ; i< length -1;i++)//判断到倒数第二个
{
t1 = valueofnum(s[i]);
t2 = valueofnum(s[i+1]);
if(t1<t2) sum = sum + t2 -t1,i++;
else sum = sum +t1;
}
if(i==length-1)sum = sum+valueofnum(s[i]);
//如果此时i已经到length说明循环中t1<t2已经执行过,已经搜索完了就
return sum;
}