1.将一维数组转化为二维数组:
链接: 题目链接
这道题其实就是按要求将数组元素存储,首先保证给出的行与列与原数组元素相等,不等则将返回值为零,相等就通过循环将数据存储进新数组,不过力扣数组相关的题需要进行开辟内存空间的操作,这里具体看代码解释:
int** construct2DArray(int* original, int originalSize, int m, int n, int* returnSize, int** returnColumnSizes){
int **arr;
if((m * n)!=originalSize)
{
*returnSize=0;//返回值定为零
return arr;//空数组
}
int i,j,index=0;//index主要是让原数组进行遍历
*returnSize = m;//返回行数
*returnColumnSizes = (int*)malloc(sizeof(int) * m);
arr = (int **)malloc(sizeof(int *)*m);//开辟数组列空间
for(i=0;i<m;i++)
{
(*returnColumnSizes)[i] = n;//力扣写法,列的大小表示
arr[i] = (int*)malloc(sizeof(int) * n);//一维数组开辟空间
for(j=0;j<n;j++)
{
arr[i][j] = original[index++];
}
}
return arr;
}
2.多个数组求交集:
链接: 题目链接
这道题就是在多维数组中找元素相同的放在新数组里,比如在二维数组中的元素就是一维数组,所以有这样一个思路,可以先统计出二维数组中每个元素出现的次数,如果与其长度相等的话就说明二维数组中每个元素都存在它,代码如下:
int* intersection(int** nums, int numsSize, int* numsColSize, int* returnSize){
int arr[1001]={0};
int *ins = (int*)malloc(sizeof(int)*1001);//这里我试了1001可以ac,像901就过不了
int i,j,index=0;
for(i=0;i<numsSize;i++)
{
for(j=0;j<numsColSize[i];j++)//列的大小表示
{
arr[nums[i][j]]++;//这里统计二维数组中每个元素出现次数
}
}
for(i=0;i<1001;i++)
{
if(arr[i]==numsSize)//与二维数组大小相等的就满足条件
{
ins[index++]=i;//存进新数组中
}
}
*returnSize = index;//返回新数组长度
return ins;
}
3.移除链表元素:
链接: 题目链接
这道题与普通的删除节点数据不一样,因为假如有两个结点需要删除,普通的方法只会删除一个结点数据,所以这次可以采用递归或递推的方法去解决,代码如下:
//递归法:
struct ListNode* removeElements(struct ListNode* head, int val){
if (head == NULL)
{
return head;
}
head->next = removeElements(head->next, val);//直接将 removeElements(head->next, val) 的结果存放到 head->next 中,再判断 head->val 是否等于 val。
return head->val == val ? head->next : head;
}
//迭代法:
struct ListNode* removeElements(struct ListNode* head, int val){
while (head != NULL && head->val == val) {
head = head->next;//当只有一个数据时
}
if (head == NULL) {
return head;
}
struct ListNode* p = head;
while (p->next != NULL) {
if (p->next->val == val) {
p->next = p->next->next; //删除结点值为val的结点
} else {
p = p->next;//遍历
}
}
return head;
}
4.二叉树展开为链表:
链接: 题目链接
这道题根据题目描述,二叉树的先序遍历,先访问根结点,然后由左子树到右子树遍历就好,代码如下:
void flatten(struct TreeNode* root){
if(root){
struct TreeNode* rightChild = root -> right;
flatten(root -> left);
root -> right = root -> left;//把左子树结点放在右子树上
root -> left = NULL;//把左子树结点置空
while(root -> right){
root = root -> right;
}
flatten(rightChild);
root -> right = rightChild;
}
}