本人是一个初入java冷遇的一名小白,所以每天会练习几个java题,每一段代码有自己写的,有从网上借鉴的,由于来源已经记不清了,所以只能在这里表示感谢。这只是一个java小白日常笔记,可以给予一些和我一样的小白提供解题思路,所以大神们请手下留情~~
代码有任何问题或者有更好的优化方案,请与我联系,谢谢!!!
1.查找公共字符
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。你可以按任意顺序返回答案。
示例 1:
输入:[“bella”,“label”,“roller”]
输出:[“e”,“l”,“l”]
示例 2:
输入:[“cool”,“lock”,“cook”]
输出:[“c”,“o”]
public static List<String> commonChars(String[] A) {
List<String> ls=new ArrayList<>();
/*
* 思路:统计每个字母出现的次数,求取交集
*/
//1.记录每个字母出现的个数
int [] counts=new int[26];
char [] chs1=A[0].toCharArray();
for(int i=0;i<chs1.length;i++) {
counts[chs1[i]-'a']++;
}
//求取数组中其余的元素与第一个元素中的数据进行比较
int index=0;
for(int j=1;j<A.length;j++) {
int [] temp=new int[26];
char [] ch=A[j].toCharArray();
for(int i=0;i<ch.length;i++) {
temp[ch[i]-'a']++;
}
//求取交集
for(int x=0;x<26;x++) {
counts[x]=Math.min(counts[x],temp[x]);
}
}
//将交集取出放入到集合中
for(int i=0;i<counts.length;i++) {
if(counts[i]>0) {
for(int j=0;j<counts[i];j++) {
ls.add((char)(i+'a')+"");
}
}
}
return ls;
}
2.搜索二维矩阵
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
target = 13
输出: false
public static boolean searchMatrix(int[][] matrix, int target) {
/*
* 思路:定义两个指针(start=0,end=matrix[0].length-1),
*循环标准,start<matrix.length &&end>=0
* 尾坐标为第一行的最后一个元素,判断是否比target大还是小
* (1) 比target大,end--;
* (2) 比target大,start++;
* (3)等于为true,否则为false.
*/
//处理特殊情况int[][] matrix= {};int target=0;
if(matrix.length==0) {
return false;
}
int start=0;
int end=matrix[0].length-1;
while(start<matrix.length && end>=0) {
if(matrix[start][end]>target) {
end--;
}else if(matrix[start][end]<target) {
start++;
}else {
return true;
}
}
return false;
//算法复杂度为O(m+n),m为矩阵的行数,n为矩阵的列数
}
3. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。 - 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
public static int climbStairs(int n) {
if(n<=1) {
return 1;
}
if(n==2) {
return 2;
}
int preTwo=1;
int preOne=2;
int k=3;
int sum=3;
while(k<=n) {
sum=preOne+preTwo;
preTwo=preOne;
preOne=sum;
k++;
}
return sum;
}
4. 完全平方数
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。
示例1:
输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5
示例2:
输入: 3
输出: False
public static boolean judgeSquareSum(int c) {
int start =0;
int end=(int) Math.sqrt(c);
int sum=0;
while(start<=end) {
sum=start*start+end*end;
if(sum>c) {
end--;
}else if(sum<c) {
start++;
}else {
return true;
}
}
return false;
}
5.只出现一次的元素(其余元素出现三次)
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
public static int singleNumber(int[] nums) {
Map<Integer,Integer> mp=new HashMap<>();
for(int num:nums) {
if(mp.containsKey(num)) {
mp.put(num, 3);
}else {
mp.put(num, 1);
}
}
Set<Integer> mapSet = mp.keySet(); //获取所有的key值 为set的集合
Iterator<Integer> itor = mapSet.iterator();//获取key的Iterator便利
while(itor.hasNext()){//存在下一个值
Integer key = itor.next();//当前key值
if(mp.get(key).equals(1)){//获取value 与 所知道的value比较
//System.out.println("你要找的key :"+key);//相等输出key
return key;
}
}
return 0;
}
6. 用两个栈实现一个队列
class MyQueen{
/*
* 思路:两个栈实现一个队列,先定义两个栈stack1和stack2;
* 用stack1 实现中间转换,stack2实现队列(栈是先进后出,队列是先进先出)
*/
Stack<Integer> stack1=new Stack<>();
Stack<Integer> stack2=new Stack<>();
void push(int node){
//每一次出队时,先把剩余元素压入到中间转换的栈stack1中
while(!stack2.isEmpty()) {
stack1.push(stack2.pop());
}
stack1.push(node);
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
int pop() {
return stack2.pop();
}
}