10. 字符串
Last updated
Was this helpful?
Last updated
Was this helpful?
单纯考String的问题主要考一些基本操作,比如:
How to split String into a String array?
LC165. compare version numbers
How to get indexOf()
How to convert String into int?
Integer.parseInt()
check sign
Long type
public String fractionToDecimal(int numerator, int denominator) {
//handle exception
if(denominator == 0) return "NaN";
if(numerator == 0) return "0";
//build a StringBuilder
StringBuilder sb = new StringBuilder();
//check the sign
Long n = new Long(numerator);
Long d = new Long(denominator);
if(n * d < 0){
sb.append("-");
}
//make n and d all positive
n = Math.abs(n);
d = Math.abs(d);
//get the divide result
sb.append(n/d);
//if no remainder, return
if(n % d == 0){
return sb.toString();
}
sb.append(".");
long r = n % d;
Map<Long, Integer> map = new HashMap<>();//key is the remainder, value is the index of this remainder in StringBuilder
while(r > 0){
if(map.containsKey(r)){
sb.insert(map.get(r), "(");
sb.append(")");
break;
}else{
map.put(r, sb.length());//put into hashmap first
r *= 10;
sb.append(r / d);
r %= d;
}
}
return sb.toString();
}
各种corner case,处理的很好
public String binaryRepresentation(String n) {
// write your code here
if (n == null || n.length() == 0) {
return "";
}
n = n.trim();
if (n.indexOf(".") == -1) {
return parseInteger(n);
}
String[] strs = n.split("\\.");
String f = parseFloat(strs[1]);
if (f.equals("ERROR")) {
return "ERROR";
}
if (f.equals("") || f.equals("0")) {
return parseInteger(strs[0]);
}
return parseInteger(strs[0]) + "." + f;
}
private String parseInteger(String s) {
if (s.equals("") || s.equals("0")) {
return "0";
}
int d = Integer.parseInt(s);
String res = "";
while (d != 0) {
res = Integer.toString(d % 2) + res;
d /= 2;
}
return res;
}
private String parseFloat(String s) {
if (s.equals("") || s.equals("0")) {
return "0";
}
double d = Double.parseDouble("0." + s);
String res = "";
HashSet<Double> set = new HashSet<Double>();
while(d != 0){
//出现循环
if(res.length() > 32 || set.contains(d)){
return "ERROR";
}
set.add(d);
d = d * 2;
if(d >= 1){
res += "1";
d = d - 1;
}else{
res += "0";
}
}
return res;
}
巨多edge case, 全文背诵吧
这题还有个小技巧:IP.split("\:", -1)
class Solution {
/*
e.x."2001:0db8:85a3:0:0:8A2E:0370:7334:"
IP.split("\\:", -1) --> length = 9
IP.split("\\:", 0) == IP.split("\\:") --> remove trailing empty string, length = 8
*/
public String validIPAddress(String IP) {
if (IP == null || IP.length() == 0) return "Neither";
if (isIPv4(IP)) {
return "IPv4";
}
if (isIPv6(IP)) {
return "IPv6";
}
return "Neither";
}
private boolean isIPv4(String IP) {
String[] IPs = IP.split("\\.", -1);
if (IPs.length != 4) return false;
for (String addr: IPs) {
int val = 0;
try {
val = Integer.parseInt(addr);
} catch (NumberFormatException e) {
return false;
}
if (!addr.equals(String.valueOf(val)) || val < 0 || val > 255) return false; //"002", "-12", 256"
}
return true;
}
private boolean isIPv6(String IP) {
String[] IPs = IP.split("\\:", -1);
if (IPs.length != 8) return false;
for (String addr : IPs) {
if (addr.length() == 0 || addr.length() > 4) return false;
int val = 0;
try {
val = Integer.parseInt(addr, 16);
} catch (NumberFormatException e) {
return false;
}
if (val < 0 || addr.charAt(0) == '-') return false;
}
return true;
}
}
这题放进来纯粹是为了对比自己写的code和别人的clean code的差距
主要还是solution不同
class Solution {
/*
seen-> capital
firstCaptital
*/
public boolean detectCapitalUse(String word) {
if (word == null || word.length() < 2) return true;
boolean firstCapital = isCapital(word.charAt(0));
boolean secondCapital = isCapital(word.charAt(1));
if (!firstCapital) {
return isAllLow(word.substring(1));
} else {
if (secondCapital) {
return isAllHigh(word.substring(2));
} else {
return isAllLow(word.substring(2));
}
}
}
private boolean isCapital(char c) {
return c >= 'A' && c <= 'Z';
}
private boolean isAllHigh(String word) {
for (int i = 0; i < word.length(); i++) {
if (!isCapital(word.charAt(i))) {
return false;
}
}
return true;
}
private boolean isAllLow(String word) {
for (int i = 0; i < word.length(); i++) {
if (isCapital(word.charAt(i))) {
return false;
}
}
return true;
}
}
//clean code
class Solution {
/*
count num of caps
1. caps == 0 || caps == word.length()
2. caps == 1 && Character.isUpperCase(word.charAt(0))
*/
public boolean detectCapitalUse(String word) {
int caps = 0;
for (int i = 0; i < word.length(); i++) {
if (Character.isUpperCase(word.charAt(i))) {
caps++;
}
}
if (caps == 0 || caps == word.length()) {
return true;
}
return caps == 1 && Character.isUpperCase(word.charAt(0));
}
}
思路分析的很清晰