分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
示例 1:
输入:numerator = 1, denominator = 2
输出:“0.5”
示例 2:
输入:numerator = 2, denominator = 1
输出:“2”
示例 3:
输入:numerator = 2, denominator = 3
输出:“0.(6)”
示例 4:
输入:numerator = 4, denominator = 333
输出:“0.(012)”
示例 5:
输入:numerator = 1, denominator = 5
输出:“0.2”
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if (numerator == 0)
return "0";
StringBuilder sb = new StringBuilder();
if ((denominator ^ numerator) >>> 31 == 1)
sb.append("-");
long dividend = Math.abs(Long.valueOf(numerator));
long divisor = Math.abs(Long.valueOf(denominator));
sb.append(dividend / divisor);
dividend %= divisor;
if (dividend == 0)
return sb.toString();
sb.append(".");
Map<Long, Integer> map = new HashMap<>();
int index = sb.length();
while (dividend != 0) {
dividend *= 10;
if (map.containsKey(dividend)) {
sb.insert(map.get(dividend), "(");
sb.append(")");
break;
}
map.put(dividend, index++);
sb.append(dividend / divisor);
dividend %= divisor;
}
return sb.toString();
}
}
字符串转换整数
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s) 的算法如下:
- 读入字符串并丢弃无用的前导空格
- 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
- 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
- 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
- 如果整数数超过 32 位有符号整数范围 [ − 2 31 −2^{31} −231, 2 31 − 1 2^{31} − 1 231−1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 − 2 31 −2^{31} −231 的整数应该被固定为 − 2 31 −2^{31} −231 ,大于 2 31 − 1 2^{31} − 1 231−1 的整数应该被固定为 2 31 − 1 2^{31} − 1 231−1 。
- 返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ’ ’ 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
示例 1:
输入:s = “42”
输出:42
示例 2:
输入:s = " -42"
输出:-42
示例 3:
输入:s = “4193 with words”
输出:4193
示例 4:
输入:s = “words and 987”
输出:0
示例 5:
输入:s = “-91283472332”
输出:-2147483648
提示:
0 <= s.length <= 200
s 由英文字母(大写和小写)、数字(0-9)、’ ‘、’+’、’-’ 和 ‘.’ 组成
class Solution {
public int myAtoi(String s) {
int length = s.length();
char[] charArray = s.toCharArray();
int i = 0;
while (i < length && charArray[i] == ' ') {
i++;
}
if (i == length) {
return 0;
}
int sign = 1;
if (charArray[i] == '+') {
i++;
} else if (charArray[i] == '-') {
i++;
sign = -1;
}
int result = 0;
int max = Integer.MAX_VALUE / 10;
int max_n = Integer.MAX_VALUE % 10;
int min = Integer.MIN_VALUE / 10;
int min_n = Integer.MIN_VALUE % 10;
while (i < length) {
if (charArray[i] > '9' || charArray[i] < '0') {
break;
}
if (max < result || (max == result && charArray[i] - '0' > max_n)) {
if (sign == 1) {
return Integer.MAX_VALUE;
} else {
return Integer.MIN_VALUE;
}
}
result = result * 10 + (charArray[i++] - '0');
}
return result * sign;
}
}
整数反转
给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = -2147483648
输出:0
示例 5:
输入:x = 1534236469
输出:0
模拟
class Solution {
public int reverse(int x) {
int y = 0;
int max = Integer.MAX_VALUE / 10;
int max_n = Integer.MAX_VALUE % 10;
int min = Integer.MIN_VALUE / 10;
int min_n = Integer.MIN_VALUE % 10;
while (x != 0) {
int n = x % 10;
if ((max < y || (max == y && n > max_n)) || (min > y || (min == y && x < min_n))) {
return 0;
}
y = 10 * y + n;
x /= 10;
}
return y;
}
}
七进制数
给定一个整数,将其转化为7进制,并以字符串形式输出。
示例 1:
输入: 100
输出: “202”
示例 2:
输入: -7
输出: “-10”
模拟
class Solution {
public String convertToBase7(int num) {
if (num == 0)
return "0";
StringBuilder sb = new StringBuilder();
String sign = "";
if (num < 0) {
sign = "-";
num = -num;
}
while (num != 0) {
sb.insert(0, num % 7);
num /= 7;
}
sb.insert(0, sign);
return sb.toString();
}
}
数字转换为十六进制数
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
注意:
- 十六进制中所有字母(a-f)都必须是小写。
- 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来 表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
- 给定的数确保在32位有符号整数范围内。
- 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例 1:
输入:
26
输出:
“1a”
示例 2:
输入:
-1
输出:
“ffffffff”
模拟
class Solution {
public String toHex(int num) {
if (num == 0)
return "0";
boolean sign = true;
if (num < 0) {
num = -num - 1;
sign = false;
}
StringBuilder s = new StringBuilder();
while (num != 0) {
int mod = num % 16;
num /= 16;
if (!sign)
mod = 15 - mod;
if (mod < 10)
s.append(mod);
else
s.append((char)(mod + 87));
}
if (!sign) {
while (s.length() < 8)
s.append('f');
}
return s.reverse().toString();
}
}
位运算
class Solution {
public String toHex(int num) {
if (num == 0)
return "0";
StringBuilder sb = new StringBuilder();
char[] hex = "0123456789abcdef".toCharArray();
while (num != 0) {
sb.append(hex[num & 0x0000000f]);
num >>>= 4;
}
return sb.reverse().toString();
}
}