題目一:關於split函數開頭和結尾的空格
對於一個給定的字符串,我們需要在線性(也就是O(n))的時間裏對它做一些變形。首先這個字符串中包含着一些空格,就像"Hello World"一樣,然後我們要做的是把着個字符串中由空格隔開的單詞反序,同時反轉每個字符的大小寫。比如"Hello World"變形後就變成了"wORLD hELLO"。
注:字符串開頭的空格,split函數仍人當成分隔符,返回的String[]strs前幾個會有相應的空串,但是末尾的空白split不考慮。
import java.util.*;
public class Transform {
public String trans(String s, int n) {
// write code here
if(s == null||n == 0)
return s;
int count=0;
for(int i=s.length()-1;i>=0;i--)//統計字符串末尾的空白個數!
{
if(s.charAt(i) == ' ')
{
count++;
}else{
break;
}
}
String[] strs=s.split(" ");
StringBuilder sb=new StringBuilder();
for(int i=0;i<count;i++)
{
sb.append(" ");
}
for(int i=strs.length-1;i>=0;i--)
{
String reverse=reverseWord(strs[i]);
sb.append(reverse);
sb.append(' ');
}
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
public String reverseWord(String s){
if(s == null||s.length() == 0)
return s;
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)>='a'&&s.charAt(i)<='z')//小寫轉大寫
{
sb.append((char)(s.charAt(i)-'a'+'A'));
}else{
sb.append((char)(s.charAt(i)-'A'+'a'));//大寫轉小寫
}
}
return sb.toString();
}
}
題目二:
對於一棵由黑白點組成的二叉樹,我們需要找到其中最長的單色簡單路徑,其中簡單路徑的定義是從樹上的某點開始沿樹邊走不重複的點到樹上的另一點結束而形成的路徑,而路徑的長度就是經過的點的數量(包括起點和終點)。而這裏我們所說的單色路徑自然就是隻經過一種顏色的點的路徑。你需要找到這棵樹上最長的單色路徑。
給定一棵二叉樹的根節點(樹的點數小於等於300,請做到O(n)的複雜度),請返回最長單色路徑的長度。這裏的節點顏色由點上的權值表示,權值爲1的是黑點,爲0的是白點。
注:通過本題找到了二叉樹上任一值的最大連通路徑的方法。靈活運用二叉樹的遞歸。
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
import java.util.*;
public class LongestPath {
public int findPath(TreeNode root) {
// write code here
if(root == null)
return 0;
int[] most1=new int[1];
int[] most0=new int[1];
mostPath(root,most1,1);
mostPath(root,most0,0);
return most1[0]>most0[0]?most1[0]:most0[0];
}
//值爲cur的最長路徑
public int mostPath(TreeNode root,int[] data,int cur)
{
if(root == null)
return 0;
int current=1;
if(root.val != cur)
current=-10000;
int left=mostPath(root.left,data,cur);
int right=mostPath(root.right,data,cur);
current+=left+right;
if(current > data[0])
data[0]=current;
if(current > 0)
{
if(left > 0||right > 0)
return left>right?left+1:right+1;
else
return 1;
}else
return 0;
}
}