LintCode 算法题目 容易(三)

第一题:二叉树的所有路径 

 

给一棵二叉树,找出从根节点到叶子节点的所有路径。

142636_X2O1_2367826.png

样例

给出下面这棵二叉树:

 

所有根到叶子的路径为:

[ "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);
    }

}

 

第二题 等价二叉树 

 

检查两棵二叉树是否等价。等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等。

142703_Ffz7_2367826.png

 


/**
 * 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;
    }
}

 

第三题 翻转二叉树

翻转一棵二叉树

样例

142718_YD9j_2367826.png

 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;
    }

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/hxflar1314520/blog/955312

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值