剑指 Offer 39. 数组中出现次数超过一半的数字
题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
题解:
用map记录次数,遍历map
public int majorityElement(int[] nums) {
int res = 0;Map<Integer,Integer> map = new HashMap<>();for (int i:nums){
if (!map.containsKey(i)){
map.put(i,1);}else {
int times = map.get(i);map.remove(i);map.put(i,times+1);}}for (Map.Entry<Integer,Integer> entry : map.entrySet()){
if (entry.getValue()>nums.length/2){
res = entry.getKey();break;}}return res;}
剑指 Offer 66. 构建乘积数组
题目:
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法
题解:
表格分区,清晰图解
1.首先计算下三角,另B[0]=1
- B[0]=1
- B[1]=B[0]*A[0]
- B[2]=B[1]*A[1]
- B[3]=B[2]*A[2]
- …
- B[i]=B[i-1]*A[i-1]
2.接下来计算上三角
- temp=1
- B[4] = B[4]*temp
- B[3] = B[3]*A[4] ---->temp = temp *A[
4
] —>B[3
] = B[3] * temp - B[2]=B[2]* A[4] *A[3] —>temp = temp *A[
3
] —>B[2
] = B[2] * temp
public int[] constructArr(int[] a) {
if (a.length==0){
return new int[0];}int res[] = new int[a.length];//计算下三角res[0] = 1;for (int i=1;i<a.length;i++){
res[i] = res[i-1] * a[i-1];}//计算上三角int temp = 1;for (int i=a.length-2;i>=0;i--){
temp = temp*a[i+1];res[i] = res[i]*temp;}return res;}
剑指 Offer 57 - II. 和为s的连续正数序列
题目:
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
题解:
1.利用等差数列求和找到数组;
2.将数组存储在list集合中,返回结果
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<>();for (int a1 = 1;a1<target;a1++){
int n=1;while ((a1*n+n*(n-1)/2)<target){
n++;}if ((a1*n+n*(n-1)/2)==target){
int[] a = new int[n];int first = a1;//创建一个数组for (int i=0;i<n;i++){
a[i] = first;first++;}//将数组存储在list集合中list.add(a);}}int res[][] = new int[list.size()][];for (int i=0;i<list.size();i++){
res[i] = list.get(i);}return res;}
今天一口气把手机锁屏、壁纸、聊天记录背景全换了!!!我感觉我又可以了!
去四楼借书 ,恰巧经过了大二上一直待的位置,面向东面的露台,在那俺完成了井字棋、数据结构和计组的实验呜呜呜!