9.回文数
package java题库.LeetCode;
public class 回文数{
public static void main(String[] args){
进阶解法___数学解法(102201);
}
public static boolean 暴力方法(int x){
String s=(new StringBuilder(x+"")).reverse().toString();
if(s.equals(x+"")){
return true;
}
return false;
}
public static boolean 进阶解法___数学解法(int x){
if(x<0) return false;
int div=1;
while(x/div>=10) div*=10;
while(x>0){
int left=x/div;
int right=x%10;
if(left!=right) return false;
x=(x%div)/10;
div/=100;
}
return true;
}
public static boolean 进阶解法___巧妙解法(int x){
if(x<0 || (x!=0 && x%10==0)) return false;
int reverse=0;
while(reverse<x){
reverse=reverse*10+x%10;
x/=10;
}
return reverse==x || x==reverse/10;
}
}
罗马数字转整数
package java题库.LeetCode;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;
public class 罗马数字转整数{
public static void main(String[] args){
计算("ddd");
}
public static long 计算(String s){
int len=s.length();
int sum_=0;
for(int i=0;i<len;i++){
int value=dic(s.charAt(i));
if(i<len-1 && value<dic(s.charAt(i+1))) sum_-=value;
else sum_+=value;
}
return sum_;
}
public static int dic(char s){
switch(s){
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D':return 500;
case 'M':return 1000;
default: return 0;
}
}
public static int 字典方式(String s){
Map<Character, Integer> dic=new HashMap<Character, Integer>(){{
put('I',1);
put('V',1);
put('X',1);
put('L',1);
put('C',1);
put('D',1);
put('M',1);
}};
int len=s.length();
int sum_=0;
for(int i=0;i<len;i++){
int value=dic.get(s.charAt(i));
if(i<len-1 && value<dic.get(s.charAt(i+1))) sum_-=value;
else sum_+=value;
}
return sum_;
}
}
14. 最长公共前缀
package java题库.LeetCode;
public class 最长公共前缀{
public static void main(String[] args){
横向扫描(new String[]{"dog","racecar","car"});
}
public static String 横向扫描(String[] strs){
//这种写法是先拿两个字符串进行比较
//获得他们的公共前缀(这样在字符串数组中所有字符串公共前缀长度一定是小于等于的)
//再将公共前缀和其他字符串进行比较
if(strs.length==1) return strs[0];//如果只有一个直接输出
String first=strs[0];
String second=strs[1];
//进行比较
int i=0;
String str="";
while(i<first.length() && i<second.length()){
if(first.charAt(i)==second.charAt(i)){//相等的保存下来
str+=first.charAt(i);
}else{
break;
}
i+=1;
}
//开始和字符串数组中的其他元素进行比较
for(int j=2;j<strs.length;j++){
String current=strs[j];
i=0;
String panduan="";
while(i<str.length() && i<current.length()){
if(str.charAt(i)==current.charAt(i)){
panduan+=str.charAt(i);
}else{
if(panduan.equals("")) return "";
break;
}
i+=1;
}
str=panduan;
}
return str;
}
public static String 纵向扫描(String[] strs){
//这种写法就像当于把所有的字符串堆在一起:
//字符串1
//字符串2
//字符串3
//......
//字符串n
//然后从第一位开始比较
String first=strs[0];
for(int i=0;i<first.length();i++){//最多可以比对的次数就是first的长度
for(int j=1;j<strs.length;j++){//每次对应位置需要比对的元素个数
String item=strs[j];
if(i<item.length()){
if(first.charAt(i)!=item.charAt(i)){
return first.substring(0,i);//字符串切分
}
}
else{
//i只有等于item.length()才会进来
//这时候可以知道字符串的最小长度为(0--i-1)
return first.substring(0,i);
}
}
}
//如果第一个for循环没有进去说明first为""
//如果进去了但是没有执行return语句,那么就是说
//当前的first一定是字符串数组里面所有字符串的子串
//所以first就是最大的公共前缀
return first;
}
}
class digui {
public static String 递归(String[] strs) {
//递归写法的核心就是
//1.基本结束条件
//2.不断向基本结束条件演进
//3.可以划分成更小的自己执行运算
int right = strs.length;
if(right == 0) return "";
if(right==1)return strs[0];
return hexing(strs,0,right-1);
}
public static String hexing(String[] strs,int left,int right){
if(left==right) return strs[left];
int mid=(left+right)/2;
String leftStr=hexing(strs,left,mid);
String rightStr=hexing(strs,mid+1,right);
int i=0;
while(i<leftStr.length() && i<rightStr.length()){
//开始纵向的比对
if(leftStr.charAt(i)!=rightStr.charAt(i)){
return leftStr.substring(0,i);
}
i+=1;
}
if(leftStr.length()<rightStr.length()){
return leftStr;
}
return rightStr;
}
}