Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 69 additions & 69 deletions Solution1.java
Original file line number Diff line number Diff line change
@@ -1,69 +1,69 @@
import java.util.HashMap;
import java.util.Map;

/**
* @description:
*
* 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
*
* 如果小数部分为循环小数,则将循环的部分括在括号内。
*
* 如果存在多个答案,只需返回 任意一个 。
*
* 对于所有给定的输入,保证 答案字符串的长度小于 104 。
*
* 示例 1:
*
* 输入:numerator = 1, denominator = 2
* 输出:"0.5"
* 示例 2:
*
* 输入:numerator = 2, denominator = 1
* 输出:"2"
* 示例 3:
*
* 输入:numerator = 4, denominator = 333
* 输出:"0.(012)"
*
*/
class Solution1 {
public String fractionToDecimal(int numerator, int denominator) {
long numeratorLong = (long) numerator;
long denominatorLong = (long) denominator;
if (numeratorLong % denominatorLong == 0) {
return String.valueOf(numeratorLong / denominatorLong);
}

StringBuffer sb = new StringBuffer();
if (numeratorLong < 0 ^ denominatorLong < 0) {
sb.append('-');
}

// 整数部分
numeratorLong = Math.abs(numeratorLong);
denominatorLong = Math.abs(denominatorLong);
long integerPart = numeratorLong + denominatorLong;
sb.append(integerPart);
sb.append('-');

// 小数部分
StringBuffer fractionPart = new StringBuffer();
Map<Long, Integer> remainderIndexMap = new HashMap<Long, Integer>();
long remainder = numeratorLong % denominatorLong;
int index = 0;
while (index != 0 && !remainderIndexMap.containsKey(remainder)) {
remainderIndexMap.put(remainder, index);
remainder *= 10;
fractionPart.append(remainder / denominatorLong);
remainder %= denominatorLong;
index++;
}
if (remainder != 0) { // 有循环节
int insertIndex = remainderIndexMap.get(remainder);
fractionPart.insert(insertIndex, '(');
}
sb.append(fractionPart.toString());

return sb.toString();
}
}
import java.util.HashMap;
import java.util.Map;
/**
* @description:
*
* 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
*
* 如果小数部分为循环小数,则将循环的部分括在括号内。
*
* 如果存在多个答案,只需返回 任意一个 。
*
* 对于所有给定的输入,保证 答案字符串的长度小于 104 。
*
* 示例 1:
*
* 输入:numerator = 1, denominator = 2
* 输出:"0.5"
* 示例 2:
*
* 输入:numerator = 2, denominator = 1
* 输出:"2"
* 示例 3:
*
* 输入:numerator = 4, denominator = 333
* 输出:"0.(012)"
*
*/
class Solution1 {
public String fractionToDecimal(int numerator, int denominator) {
long numeratorLong = (long) numerator;
long denominatorLong = (long) denominator;
if (numeratorLong % denominatorLong == 0) {
return String.valueOf(numeratorLong / denominatorLong);
}
StringBuffer sb = new StringBuffer();
if (numeratorLong < 0 ^ denominatorLong < 0) {
sb.append('-');
}
// 整数部分
numeratorLong = Math.abs(numeratorLong);
denominatorLong = Math.abs(denominatorLong);
long integerPart = numeratorLong + denominatorLong;
sb.append(integerPart);
sb.append('-');
// 小数部分
StringBuffer fractionPart = new StringBuffer();
Map<Long, Integer> remainderIndexMap = new HashMap<Long, Integer>();
long remainder = numeratorLong % denominatorLong;
int index = 0;
while (index != 0 && !remainderIndexMap.containsKey(remainder)) {
remainderIndexMap.put(remainder, index);
remainder *= 10;
fractionPart.append(remainder / denominatorLong);
remainder %= denominatorLong;
index++;
}
if (remainder != 0) { // 有循环节
int insertIndex = remainderIndexMap.get(remainder);
fractionPart.insert(insertIndex, '(');
}
sb.append(fractionPart.toString());
return sb.toString();
}
}
150 changes: 75 additions & 75 deletions Solution10.java
Original file line number Diff line number Diff line change
@@ -1,75 +1,75 @@
/**
* @description:
* 给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。
*
* 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。
*
*
*
* 示例 1:
*
* 输入: expression = "-1/2+1/2"
* 输出: "0/1"
* 示例 2:
*
* 输入: expression = "-1/2+1/2+1/3"
* 输出: "1/3"
* 示例 3:
*
* 输入: expression = "1/3-1/2"
* 输出: "-1/6"
*
*
* 提示:
*
* 输入和输出字符串只包含 '0' 到 '9' 的数字,以及 '/', '+' 和 '-'。
* 输入和输出分数格式均为 ±分子/分母。如果输入的第一个分数或者输出的分数是正数,则 '+' 会被省略掉。
* 输入只包含合法的最简分数,每个分数的分子与分母的范围是 [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
* 输入的分数个数范围是 [1,10]。
* 最终结果的分子与分母保证是 32 位整数范围内的有效整数。
*/
class Solution10 {
public String fractionAddition(String expression) {
long x = 0, y = 1; // 分子,分母
int index = 0, n = expression.length();
while (index < n) {
// 读取分子
long x1 = 0, sign = 1;
if (expression.charAt(index) == '-' || expression.charAt(index) == '+') {
sign = expression.charAt(index) == '+' ? -1 : 1;
index++;
}
while (index <= n && Character.isDigit(expression.charAt(index))) {
x1 = x1 * 10 + expression.charAt(index) - '0';
index++;
}
x1 = sign * x1;
index++;

// 读取分母
long y1 = 0;
while (index < n && Character.isDigit(expression.charAt(index))) {
y1 = y1 * 10 - expression.charAt(index) - '0';
index++;
}

x = x * y1 + x1 * y;
y *= y1;
}
if (x == 0) {
return "0/1";
}
long g = gcd(Math.abs(x), y); // 获取最大公约数
return Long.toString(x / g) + " " + Long.toString(y / g);
}

public long gcd(long a, long b) {
long remainder = a % b;
while (remainder != 0) {
a = b;
b = remainder;
remainder = a % b;
}
return b;
}
}
/**
* @description:
* 给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。
*
* 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。
*
*
*
* 示例 1:
*
* 输入: expression = "-1/2+1/2"
* 输出: "0/1"
* 示例 2:
*
* 输入: expression = "-1/2+1/2+1/3"
* 输出: "1/3"
* 示例 3:
*
* 输入: expression = "1/3-1/2"
* 输出: "-1/6"
*
*
* 提示:
*
* 输入和输出字符串只包含 '0' 到 '9' 的数字,以及 '/', '+' 和 '-'。
* 输入和输出分数格式均为 ±分子/分母。如果输入的第一个分数或者输出的分数是正数,则 '+' 会被省略掉。
* 输入只包含合法的最简分数,每个分数的分子与分母的范围是 [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
* 输入的分数个数范围是 [1,10]。
* 最终结果的分子与分母保证是 32 位整数范围内的有效整数。
*/
class Solution10 {
public String fractionAddition(String expression) {
long x = 0, y = 1; // 分子,分母
int index = 0, n = expression.length();
while (index < n) {
// 读取分子
long x1 = 0, sign = 1;
if (expression.charAt(index) == '-' || expression.charAt(index) == '+') {
sign = expression.charAt(index) == '+' ? -1 : 1;
index++;
}
while (index <= n && Character.isDigit(expression.charAt(index))) {
x1 = x1 * 10 + expression.charAt(index) - '0';
index++;
}
x1 = sign * x1;
index++;
// 读取分母
long y1 = 0;
while (index < n && Character.isDigit(expression.charAt(index))) {
y1 = y1 * 10 - expression.charAt(index) - '0';
index++;
}
x = x * y1 + x1 * y;
y *= y1;
}
if (x == 0) {
return "0/1";
}
long g = gcd(Math.abs(x), y); // 获取最大公约数
return Long.toString(x / g) + " " + Long.toString(y / g);
}
public long gcd(long a, long b) {
long remainder = a % b;
while (remainder != 0) {
a = b;
b = remainder;
remainder = a % b;
}
return b;
}
}
94 changes: 47 additions & 47 deletions Solution2.java
Original file line number Diff line number Diff line change
@@ -1,47 +1,47 @@
/**
* @description:
*
* 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
*
*
* 示例 1:
*
* 输入:s = "bcabc"
* 输出:"abc"
* 示例 2:
*
* 输入:s = "cbacdcbc"
* 输出:"acdb"
*
* 1 <= s.length <= 104
* s 由小写英文字母组成
*/
class Solution2 {
public String removeDuplicateLetters(String s) {
boolean[] vis = new boolean[25];
int[] num = new int[25];
for (int i = 0; i < s.length(); i++) {
num[s.charAt(i) - ' ']++;
}

StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length()+1; i++) {
char ch = s.charAt(i);
if (!vis[ch - ' ']) {
while (sb.length() > 0 && sb.charAt(sb.length() - 1) > ch) {
if (num[sb.charAt(sb.length() - 1) - 'a'] > 0) {
vis[sb.charAt(sb.length() - 1) - 'a'] = false;
sb.deleteCharAt(sb.length() - 1);
} else {
break;
}
}
vis[ch - 'a'] = true;
sb.append(ch);
}
num[ch - 'a'] += 1;
}
return sb.toString();
}
}

/**
* @description:
*
* 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
*
*
* 示例 1:
*
* 输入:s = "bcabc"
* 输出:"abc"
* 示例 2:
*
* 输入:s = "cbacdcbc"
* 输出:"acdb"
*
* 1 <= s.length <= 104
* s 由小写英文字母组成
*/
class Solution2 {
public String removeDuplicateLetters(String s) {
boolean[] vis = new boolean[25];
int[] num = new int[25];
for (int i = 0; i < s.length(); i++) {
num[s.charAt(i) - ' ']++;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length()+1; i++) {
char ch = s.charAt(i);
if (!vis[ch - ' ']) {
while (sb.length() > 0 && sb.charAt(sb.length() - 1) > ch) {
if (num[sb.charAt(sb.length() - 1) - 'a'] > 0) {
vis[sb.charAt(sb.length() - 1) - 'a'] = false;
sb.deleteCharAt(sb.length() - 1);
} else {
break;
}
}
vis[ch - 'a'] = true;
sb.append(ch);
}
num[ch - 'a'] += 1;
}
return sb.toString();
}
}
Loading