第一题:二叉树的所有路径
给一棵二叉树,找出从根节点到叶子节点的所有路径。
样例
给出下面这棵二叉树:
所有根到叶子的路径为:
[ "1->2->5", "1->3" ]
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root the root of the binary tree
* @return all root-to-leaf paths
*/
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<String>();
if(root==null) {
return result;
}
String str = Integer.toString(root.val);
findPaths(root,str,result);
return result;
}
public void findPaths(TreeNode root, String str,List<String> result){
String left= new String();
String right = new String();
if(root.left!=null)
{
left = str+"->"+Integer.toString(root.left.val);
this.findPaths(root.left,left, result);
}
if(root.right!=null)
{
right = str+"->"+Integer.toString(root.right.val);
this.findPaths(root.right,right,result);
}
if(root.right==null&&root.left==null) result.add(str);
}
}
第二题 等价二叉树
检查两棵二叉树是否等价。等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param a, b, the root of binary trees.
* @return true if they are identical, or false.
*/
public boolean isIdentical(TreeNode a, TreeNode b) {
if(a == null && b == null){
return true;
}
if((a == null && b != null) ||( a != null && b == null)){
return false;
}
if(a.val == b.val){
return isIdentical(a.left, b.left) && isIdentical(a.right, b.right);
}
return false;
}
}
第三题 翻转二叉树
翻转一棵二叉树
样例
public void invertBinaryTree(TreeNode root) {
if(root==null){
return ;
}
TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
invertBinaryTree(root.left);
invertBinaryTree(root.right);
}
第四题 经典二分查找问题
在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1
样例
给出数组 [1, 2, 2, 4, 5, 5].
- 对于 target = 2, 返回 1 或者 2.
- 对于 target = 5, 返回 4 或者 5.
- 对于 target = 6, 返回 -1.
public int findPosition(int[] nums, int target) {
if(nums.length == 0){
return -1;
}
int left = 0;
int right = nums.length - 1;
int mid = 0;
while(left < right){
mid = (right + left) / 2 ;
if(target > nums[mid])
left = mid + 1;
else if(target < nums[mid])
right = mid - 1;
else
right = mid;
}
if(target == nums[right]){
return right;
}
return -1;
}
第五题 空格替换
设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。
你的程序还需要返回被替换后的字符串的长度。
注意事项
如果使用 Java 或 Python, 程序中请用字符数组表示字符串。
样例
对于字符串"Mr John Smith", 长度为 13
替换空格之后,参数中的字符串需要变为"Mr%20John%20Smith",并且把新长度 17作为结果返回。
public int replaceBlank(char[] string, int length) {
for(int i = 0;i < length; i++) {
if(string[i] == ' ') {
for(int j = length+2; j > i+2; j--) {
string[j] = string[j-2];
}
string[i] = '%';
string[i+1] = '2';
string[i+2] = '0';
length = length+2;
}
}
return length;
}
第六题 最长单词
给一个词典,找出其中所有最长的单词。
样例
在词典
{ "dog", "google", "facebook", "internationalization", "blabla" }
中, 最长的单词集合为 ["internationalization"]
在词典
{ "like", "love", "hate", "yes" }
中,最长的单词集合为 ["like", "love", "hate"]
ArrayList<String> longestWords(String[] dictionary) {
if(dictionary.length == 0){
return null;
}
ArrayList<String> list = new ArrayList<String>();
int max = dictionary[0].length();
for(int i = 1 ; i < dictionary.length; i ++){
if( max < dictionary[i].length()){
max = dictionary[i].length();
}
}
for(int i = 0 ; i < dictionary.length; i ++){
if( max == dictionary[i].length()){
list.add(dictionary[i]);
}
}
return list;
}
第七题 岛屿的个数
给一个01矩阵,求不同的岛屿的个数。
0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
样例
在矩阵:
[ [1, 1, 0, 0, 0], [0, 1, 0, 0, 1], [0, 0, 0, 1, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1] ]
中有 3 个岛.
public int numIslands(boolean[][] grid) {
int numbers = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if(grid[i][j]){
numbers++;
solve(grid, i ,j);
}
}
}
return numbers;
}
public void solve(boolean[][] grid, int i , int j){
if(i<0 || i >= grid.length || j<0 || j >= grid[i].length){
return ;
}
if(!grid[i][j]){
return ;
}
grid[i][j] = false;
solve(grid, i-1, j);
solve(grid, i+1, j);
solve(grid, i, j-1);
solve(grid, i, j+1);
}
注:if条件中j 的取值范围
第八题 有效的括号序列
给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '['and ']', 判定是否是有效的括号序列。
样例
括号必须依照 "()" 顺序表示, "()[]{}" 是有效的括号,但 "([)]"则是无效的括号。
public boolean isValidParentheses(String s) {
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '['){
stack.push(s.charAt(i));
}
if(s.charAt(i) == ')' || s.charAt(i) == '}' || s.charAt(i) == ']'){
if(stack.isEmpty()){
return false;
}
char pop = stack.pop();
if((pop == '(' && s.charAt(i) == ')' )||
(pop == '{' && s.charAt(i) == '}' )||
(pop == '[' && s.charAt(i) == ']' )){
continue;
}else{
return false;
}
}
}
if(stack.isEmpty()){
return true;
}else{
return false;
}
}
第九题 最后一个单词的长度
给定一个字符串, 包含大小写字母、空格' ',请返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
注意事项
一个单词的界定是,由字母组成,但不包含任何的空格。
样例
给定 s = "Hello World",返回 5。
public int lengthOfLastWord(String s) {
if(s == null){
return 0;
}
if( s.indexOf(" ") == -1){
return s.length();
}
String[] strings = s.split(" ");
return strings[strings.length - 1].length();
}
第十题 报数
报数指的是,按照其中的整数的顺序进行报数,然后得到下一个数。如下所示:
1, 11, 21, 1211, 111221, ...
1 读作 "one 1" -> 11.
11 读作 "two 1s" -> 21.
21 读作 "one 2, then one 1" -> 1211.
给定一个整数 n, 返回 第 n 个顺序。
注意事项
整数的顺序将表示为一个字符串。
样例
给定 n = 5, 返回 "111221".
public String countAndSay(int n) {
String oldString = "1";
if (n <= 0) {
return null;
}
if (n == 1) {
return oldString;
}
while (--n > 0) {
StringBuilder sb = new StringBuilder();
char[] oldChars = oldString.toCharArray();
for (int i = 0; i < oldChars.length; i++) {
int count = 1;
while ((i + 1) < oldChars.length
&& oldChars[i] == oldChars[i + 1]) {
count++;
i++;
}
sb.append(String.valueOf(count) + String.valueOf(oldChars[i]));
}
oldString = sb.toString();
}
return oldString;
}