Task01:数组

理论部分

  • 理解数组的存储与分类。
  • 实现动态数组,该数组能够根据需要修改数组的长度。

练习部分

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);
	}

}
发布了8 篇原创文章 · 获赞 1 · 访问量 196

猜你喜欢

转载自blog.csdn.net/Moby97/article/details/103866763