数组学习
1.利用动态数组解决数据存放问题
思路:
首先判断数组内存是否已满,没满继续添加元素,已满则定义一个新的数组为原来数组的两倍,把原数组的数据拷贝到新数组中,以此类推即可。
public class Testday01T1 {
//利用动态数组解决数据存放问题
//存放2~N之间所有5或7的倍数
public static void main(String[] args) {
int[] nums=new int[5];
int N=100;
int count=0;
for(int i=2;i<=N;i++){
if(count==nums.length){
System.out.println(Arrays.toString(nums));
int[] nums1=new int[nums.length*2];
System.out.println(nums1.length);
for(int j=0;j<nums.length;j++){
nums1[j]=nums[j];
}
nums=nums1;
}else{
if(i%5==0||i%7==0){
nums[count++]=i;
}
}
}
System.out.println(Arrays.toString(nums));
}
}
2.托普利茨矩阵问题
思路:
暴力解法,判断两个斜对角线的值是否相等,该题需要注意的是数组越界问题,要确定好遍历数组的边界问题。
public class ToplitzMatrix {
//托普利茨矩阵(day01T2)
//leetcode:766
public static void main(String[] args) {
int[][] matrix={{11,74,0,93},{40,11,74,7}};
boolean flag=true;
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(i+1<matrix.length&&j+1<matrix[0].length&&matrix[i][j]!=matrix[i+1][j+1]){
flag=false;
break;
}
}
}
System.out.println(flag);
}
}
3.三数之和
思路:
自己开始没想到,后来参考了别人的解题思路,具体如下,
1.先对数组进行排序,如果第一个数大于0,直接返回。
2.第一个数小于0,则用数组前两个数和最后一个数相加,如果小于0,则用第二个数和第三个数与最后一个数相加,如果大于0,则用数组前两个数个倒数第二个数相加与0比较。注意跳出循环条件。
public class SumThree {
//三数之和(day01T3)
//leetcode:15
public static void main(String[] args) {
int[] nums={-1, 0, 1, 2, -1, -4};
List<List<Integer>> ans = new ArrayList<>();
if(nums == null || nums.length < 3){
System.out.println(ans);
}
Arrays.sort(nums); // 排序
for (int i = 0; i < nums.length ; i++) {
if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
if(i > 0 && nums[i] == nums[i-1]) continue; // 去重
int L = i+1;
int R = nums.length-1;
while(L < R){
int sum = nums[i] + nums[L] + nums[R];
if(sum == 0){
ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
while (L<R && nums[L] == nums[L+1]) L++; // 去重
while (L<R && nums[R] == nums[R-1]) R--; // 去重
L++;
R--;
}
else if (sum < 0) L++;
else if (sum > 0) R--;
}
}
System.out.println(ans);
}
}