LeetCode解题报告—— Group Anagrams & Pow(x, n) & Spiral Matrix
1. Group Anagrams
Given an array of strings, group anagrams together.
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"],
[
["ate", "eat","tea"],
["nat","tan"],
["bat"]
]
Note: All inputs will be in lower-case.
思路:利用一个map,key是构成字符串的字符,value是与之相对应的字符串集合。比如“ate”和“eat”对应的是aet。遍历所有字符串,将字符串分解为字符数组后排序,再转为字符串,如果再key中则将这个字符串添加到这个key所对应的集合中,如果不在则新增key即可。
import java.util.*;
public class LeetCode{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
String[] strs=str.split(",");
List<List<String>> res=groupAnagrams(strs);
for(List<String> list:res){
for(String s:list)
System.out.print(s+" ");
System.out.println();
}
}
static List<List<String>> groupAnagrams(String[] strs){
if (strs == null || strs.length == ) return new ArrayList<List<String>>();
Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String s : strs) {
char[] ca = s.toCharArray();
Arrays.sort(ca);
String keyStr = String.valueOf(ca);
if (!map.containsKey(keyStr)) map.put(keyStr, new ArrayList<String>());
map.get(keyStr).add(s);
}
return new ArrayList<List<String>>(map.values());
}
}
上面需要注意的是map的用法:
- map.containsKey(keyStr) 判断是否存在指定的key
- map.values() 以Collection<>集合的形式返回所有的value
- map.containsValue(Object value) 判断指定的value是否存在
2. Pow(x, n)
Implement pow(x, n).
Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
思路:实现指数计算函数,虽然可以使用遍历来乘,但肯定会超时,所以还得想别的办法。 最简单的想法是,如果n能被2整除,那么pow(x,n)=pow(x*x, n/2),如果不能整除则pow(x, n)=x*pow(x*x, n/2),over。
public class Solution {
public double pow(double x, int n) {
if(n == 0)
return 1;
if(n<0){
n = -n;
x = 1/x;
}
return (n%2 == 0) ? pow(x*x, n/2) : x*pow(x*x, n/2);
}
}
3. Spiral(漩涡,螺旋) Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
思路:思路一是模拟,首先明确一点的是这个漩涡路径是方向的改变是顺时针,且遇到边界或者是遇到之前访问过的数字,从这个规律来入手模拟。设数组有R行和C列,seen[r][c]代表第r行第c列上的数字是访问过的。我们目前的位置是(r,c),目前的方向是 di。当我们遍历整个矩阵时,我们候选的下个位置是(cr,cc),如果它没有超出边界并且没有访问过,则下一个遍历的位置就是它,否则按顺时针旋转方向。
import java.util.*;
public class LeetCode{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
sc.nextLine();
int[][] matrix=new int[m][n];
for(int i=0;i<m;i++){
String input=sc.nextLine().replaceAll("\\]|\\[| ","");
String[] inputs=input.split(",");
for(int j=0;j<inputs.length;j++){
matrix[i][j]=Integer.parseInt(inputs[j]);
}
}
List<Integer> ans=spiralOrder(matrix);
for(int a:ans)
System.out.print(a+" ");
}
static List<Integer> spiralOrder(int[][] matrix){
List ans=new ArrayList();
if(matrix.length==0) return ans;
int R=matrix.length, C=matrix[0].length;
boolean[][] seen=new boolean[R][C];
int[] dr={0,1,0,-1}; // 这里用dr,dc的组合来代表上下左右四个方向
int[] dc={1,0,-1,0};
int r=0, c=0, di=0;
for(int i=0;i<R*C;i++){
ans.add(matrix[r][c]);
seen[r][c]=true;
int cr=r+dr[di];
int cc=c+dc[di];
if(0<=cr&&cr<R&&0<=cc&&cc<C&&!seen[cr][cc]){ // 这里大小比较要分开写,不能写成0<=cr<R这种形式
r=cr;
c=cc;
}else{
di=(di+1)%4;
r+=dr[di];
c+=dc[di];
}
}
return ans;
}
}
LeetCode解题报告—— Group Anagrams & Pow(x, n) & Spiral Matrix的更多相关文章
- LeetCode解题报告:Linked List Cycle && Linked List Cycle II
LeetCode解题报告:Linked List Cycle && Linked List Cycle II 1题目 Linked List Cycle Given a linked ...
- leetcode解题报告(2):Remove Duplicates from Sorted ArrayII
描述 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...
- 【LeetCode】49. Group Anagrams 解题报告(Python & Java & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+hash 日期 题目地址:https://le ...
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
- 【一天一道LeetCode】#49. Group Anagrams
一天一道LeetCode系列 (一)题目 Given an array of strings, group anagrams together. For example, given: [" ...
- LeetCode解题报告汇总! All in One!
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 把自己刷过的所有题目做一个整理,并且用简洁的语言概括了一下思路,汇总成了一个表格. 题目 ...
- 【LeetCode】49. Group Anagrams
题目: Given an array of strings, group anagrams together. For example, given: ["eat", " ...
- LeetCode OJ 49. Group Anagrams
题目 Given an array of strings, group anagrams together. For example, given: ["eat", "t ...
- LeetCode OJ:Group Anagrams(同字符字符群)
Given an array of strings, group anagrams together. For example, given: ["eat", "tea& ...
随机推荐
- HDOJ.2187 悼念512汶川大地震遇难同胞——老人是真饿了(贪心)
悼念512汶川大地震遇难同胞--老人是真饿了 点我挑战题目 题目分析 每组数据给出所拥有的钱数,和大米的种类.每种大米给出单价(每单位重量)和大米的重量.求能买到的大米最大重量是多少? 采用贪心算法. ...
- python多进程之Process
由于fork创建进程不能在windows系统上使用,所以产生了multiprocessing.Process Process可以直接实例化然后用start调用,需要指定新的进程执行的函数,用元组的方式 ...
- Spark获取某个手机号在某个基站下停留的时间和当前手机所在的位置的案例
1.业务需求 在拥有手机号在每个基站处停留时间日志 和 基站信息的 算出某个手机号的(所在基站,停留时间),(当前所在经度,当前所在纬度) 其中手机连接基站产生的日志信息类似如下: 186888888 ...
- UVA 10201 DP
Adventures in Moving - Part IV 题意: 汽车邮箱容量200升,最初有100升油,要求到达终点油箱中的油不少于100升的最小花费,不能到达终点输出Impossible. 汽 ...
- java线程的基本概念
进程和线程 进程的诞生 操作系统中有2个任务A,B,任务A先执行,执行到一半需要io,因此要大量时间,在这个时间段内cpu是空闲的,浪费了资源,于是就有进程,当A暂时无法利用cpu,但是又不能销毁时, ...
- Mybatis中select传递多个参数
一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...
- [CodeChef - GERALD07 ] Chef and Graph Queries
Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...
- 【CodeForces】582 C. Superior Periodic Subarrays
[题目]C. Superior Periodic Subarrays [题意]给定循环节长度为n的无限循环数列,定义(l,s)表示起点为l的长度为s的子串,(l,s)合法要求将子串从该起点开始以s为循 ...
- 【BZOJ】1299: [LLH邀请赛]巧克力棒
[算法]博弈论 [题解]这道题不是典型的SG函数题了. 不把它当成游戏看待,那么这道题是在说n个石子堆,每次可以加入若干个或进行Nim游戏. 我们当前先手,则考虑构造必败态来获胜. 当前已加入的NIm ...
- Linux 命令行生成密码的 10 种方式
内容来自: 10 Ways to Generate a Random Password from the Linux Command Line Linux 好玩的事儿是达成一件事情可以用上百种方式. ...