理论部分
- 理解数组的存储与分类。
- 实现动态数组,该数组能够根据需要修改数组的长度。
练习部分
1. 利用动态数组解决数据存放问题
编写一段代码,要求输入一个整数N
,用动态数组A
来存放[2,N]
之间所有5或7的倍数,输出该数组。
示例:
输入: N = 100 输出: 5 7 10 14 15 20 21 25 28 30 35 40 42 45 49 50 55 56 60 63 65 70 75 77 80 84 85 90 91 95 98 100
解决方案:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
int n,*array = 0,j=0;
void Input()
{
int i = 0,num = 0;
scanf("%d",&n);
array = (int *)malloc(sizeof(int)*n);
if(array == 0)
{
printf("error");
}
for(i=2;i<=n;i++)
{
if(i%5==0||i%7==0)
{
array[j]=i;
j++;
}
}
}
void Outpu(){
for(int i=0;i<j;i++)
printf("%d ",array[i]);
}
int main()
{
Input();
Outpu();
free(array);
return 0;
}
2. 托普利茨矩阵问题
如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。
给定一个M x N
的矩阵,当且仅当它是托普利茨矩阵时返回True
。
示例:
输入: matrix = [ [1,2,3,4], [5,1,2,3], [9,5,1,2] ] 输出: True
解释:
在上述矩阵中, 其对角线为: "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"
。 各条对角线上的所有元素均相同, 因此答案是True
。
解决方案:
matrix = [ [1,2,3,4], [5,1,2,3], [9,5,1,2] ]
def solve(matrix):
for r in range(len(matrix)-1):
for c in range(len(matrix[0])-1):
if matrix[r+1][c+1] and matrix[r][c] != matrix[r+1][c+1]:
return False
return True
solve(matrix)
3. 三数之和
https://leetcode-cn.com/problems/3sum/
给定一个包含 n 个整数的数组nums
,判断nums
中是否存在三个元素a,b,c
,使得a + b + c = 0
?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
解决方案:
public class SumThree {
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;
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);
}
}