java每日练习_day1

本人是一个初入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 阶 + 1 阶
  2. 2 阶
    示例 2:
    输入: 3
    输出: 3
    解释: 有三种方法可以爬到楼顶。
  3. 1 阶 + 1 阶 + 1 阶
  4. 1 阶 + 2 阶
  5. 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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值