当前位置: 首页 > article >正文

今日写题work

题目一:轮转数组

三种思路,时间复杂度越优越好

第一种思路: 直接暴力求解,空间复杂度为o(1),但时间复杂度为o(n^2)

#include <stdio.h>
void rotate(int* nums, int k, int len);
int main()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	rotate(arr, 3, sizeof(arr) / sizeof(int));
	for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
	{
		printf("%d ", arr[i]);
	}

}
void rotate(int* nums, int k, int len)
{
	if (k > len)
	{
		k %= len;
	}
	int i = 0, j = 0;
	for (i = 0; i < k; i++)
	{
		int tmp = nums[len - 1];
		for (j = len - 1; j > 0; j--)
		{
			nums[j] = nums[j - 1];
		}
		nums[j] = tmp;
	}
}

第二种思路: 调用库函数,时间复杂度o(n),但空间复杂度为o(n)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void rotate(int* nums, int k, int len);
int main()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	rotate(arr, 3, sizeof(arr) / sizeof(int));
	for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
	{
		printf("%d ", arr[i]);
	}

}
void rotate(int* nums, int k, int len)
{
	if (k > len)
	{
		k %= len;
	}
	int* tmp = (int*)malloc(sizeof(int) * len);
	if (tmp == NULL)
	{
		perror("malloc failed\n");
		return 1;
	}
	memcpy(tmp, nums + len - k, sizeof(int) * k);
	memcpy(tmp + k, nums, sizeof(int) * (len - k));
	memcpy(nums, tmp, sizeof(int) * len);

	free(tmp);
}

第三种思路: 翻转三次,时间复杂度0(n),空间复杂度o(1),最优解

#include <stdio.h>
void rotate(int* nums, int k, int len);
void Reverse(int* arr, int left, int right);
int main()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	rotate(arr, 3, sizeof(arr) / sizeof(int));
	for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
	{
		printf("%d ", arr[i]);
	}

}
void Reverse(int* arr, int left, int right)
{
	while (left < right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
void rotate(int* nums, int k, int len)
{
	if (k > len)
	{
		k %= len;
	}
	Reverse(nums, 0, len - k - 1);
	Reverse(nums, len - k, len - 1);
	Reverse(nums, 0, len - 1);
}

题目二:消失的数字

两种思路,时间复杂度要求o(n)

第一种思路: 直接公式,求和(等差数列)

#include <stdio.h>
int missingNumber(int* nums, int numsSize);
int main()
{
	int arr[] = { 0,2,3 };
	int ret = missingNumber(arr, 3);
	printf("%d", ret);
	return 0;
}
int missingNumber(int* nums, int numsSize)
{
	int sum = (0 + numsSize) * (numsSize + 1) / 2;
	for (int i = 0; i < numsSize; i++)
	{
		sum -= nums[i];
	}
	return sum;
}

第二种思路: 异或(可参考往期博客单身狗)

#include <stdio.h>
int missingNumber(int* nums, int numsSize);
int main()
{
	int arr[] = { 0,2,3 };
	int ret = missingNumber(arr, 3);
	printf("%d", ret);
	return 0;
}
int missingNumber(int* nums, int numsSize) 
{
	int val = 0;
	for (int i = 0; i < numsSize; i++)
	{
		val ^= nums[i];
	}
	for (int i = 0; i <= numsSize; i++)
	{
		val ^= i;
	}
	return val;
}


http://www.kler.cn/a/538382.html

相关文章:

  • React受控组件的核心原理与实战精要
  • jupyterLab插件开发
  • mysql 存储过程和自定义函数 详解
  • Java数据结构 | TreeMap 和 TreeSet
  • 我用AI做数据分析之数据清洗
  • Python 实现 gRPC 与 原始 RPC 的对比:理解 RPC 的基本功能
  • Https握手过程 (面试题)
  • PMP–一、二、三模–分类–13.干系人管理
  • Python关键字全解析与实例应用
  • python Excel 表读取合并单元格以及清除空格符
  • #渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞
  • JUnit 5 中获取测试类、测试方法及属性的注解
  • DeepSeek与Vue.js组件开发:解锁AI与前端开发的融合密码
  • 算法兵法全略(译文)
  • 低代码系统-插件功能分析( 某道云)
  • 线性dp-安全序列
  • 指向深度学习的“信息技术”课程单元教学设计方案
  • 数据表中的视图操作
  • 激活函数篇 03 —— ReLU、LeakyReLU、RandomizedLeakkyReLU、PReLU、ELU
  • 如何参与开源项目
  • 33.日常算法
  • Python进阶-在Ubuntu上部署Flask应用
  • iPhone 在华销量大幅下挫
  • STM32启动过程概述
  • Elasticsearch term精确查询无数据
  • Maven 依赖范围与排除