手撕C语言题典——轮转数组

目录

前言

一,思路 

1)暴力求解 O(N^2)

2)三段逆置 

 二,代码实现


前言

     随着C语言的深入,我们准备转向C++方面学习,学习C++之前我们需要搞懂时间复杂度,这个蛮重要的,我们将通过几个题来了解什么是时间复杂度以及为什么会有这个概念的出现,这对我们做题以及竞赛会很有帮助。

   依旧是力扣上的一道题,我们将用不同时间复杂度的方式来进行求解,,让我们看看两种方法的不同之处。

189. 轮转数组 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/rotate-array/description/

题目很简单,我们只需要将所给数据旋转

我们要考虑它的时间复杂度的多种情况,通过样例我们可以看出真实的旋转次数:K% = N

所以:

时间复杂度:O(N*K)

最坏情况:K%N等于N-1  -> O(N^2)

最好情况:K%N等于0

一,思路 

1)暴力求解 O(N^2)

     但我们尝试写出这个代码并且提交的时候会发现结果超出时间限制了,贴一下我的笔记大家可以参考一下代码:

2)三段逆置 

要知道这个方法的时间复杂度我们需要简单了解一下这个方法的思路:

  • 前 n-k 个逆置

  • 后 k 个逆置

  • 整体逆置

简单来看分三步其实算两次,所以时间复杂度应该是O(n),用样例来模拟一下:

 二,代码实现

void reverse(int *a,int left,int right)
{
    while(left<right){
        int tmp = a[left];
        a[left] = a[right];
        a[right] = tmp;
        ++left;
        --right;
    }
}

void rotate(int* nums, int numsSize, int k) {
    k %= numsSize;
    reverse(nums,0,numsSize-k-1);
    reverse(nums,numsSize-k,numsSize-1);
    reverse(nums,0,numsSize-1);
}

   因为用的C写的代码所以还是要定义一下这个逆置函数,不过主体就简单了

    🎈🎈完结撒花🎈🎈  

### C语言编程练习与面试 以下是针对C语言的一些经练习和面试,涵盖了基础数据结构、字符串处理以及算法设计等内容。 #### 1. 数组操作 编写一个函数 `void reverseArray(int arr[], int size)` 来反转给定整数数组的内容。 例如:输入 `[1, 2, 3, 4]` 输出应为 `[4, 3, 2, 1]`[^1]。 ```c #include <stdio.h> void reverseArray(int arr[], int size) { for (int i = 0; i < size / 2; ++i) { int temp = arr[i]; arr[i] = arr[size - i - 1]; arr[size - i - 1] = temp; } } int main() { int arr[] = {1, 2, 3, 4}; int size = sizeof(arr)/sizeof(arr[0]); printf("Original Array: "); for (int i = 0; i < size; ++i) { printf("%d ", arr[i]); } reverseArray(arr, size); printf("\nReversed Array: "); for (int i = 0; i < size; ++i) { printf("%d ", arr[i]); } return 0; } ``` --- #### 2. 字符串匹配问 实现一个函数 `int* findAnagrams(char *s, char *p, int* returnSize)`,用于查找字符串`s`中的所有字母异位词的位置索引集合。返回的结果存储在一个动态分配的整型指针中[^3]。 此涉及滑动窗口技术的应用,需注意边界条件的处理。 --- #### 3. 动态内存管理 创建一个程序来模拟简单的堆内存管理系统。该系统支持以下功能: - 分配指定大小的连续内存块。 - 释放已分配的内存块。 - 显示当前可用的总剩余空间。 提示:可以使用链表或其他自定义的数据结构来跟踪已分配和未分配的空间区域。 --- #### 4. 文件读写操作 编写一段代码片段,从标准输入流接收多行文本直到遇到EOF为止,并将其逐行写入文件`output.txt`中。最后统计并打印出总共写入了多少字节的数据[^2]。 ```c #include <stdio.h> #include <string.h> int main() { FILE *fp = fopen("output.txt", "w"); if (!fp) { perror("Failed to open file"); return 1; } char buffer[256]; int totalBytesWritten = 0; while(fgets(buffer, sizeof(buffer), stdin)) { fprintf(fp, "%s", buffer); totalBytesWritten += strlen(buffer); } fclose(fp); printf("Total bytes written: %d\n", totalBytesWritten); return 0; } ``` --- #### 5. 最长公共前缀 给出两个字符串`s1`和`s2`,求它们的最大公共前缀长度。如果不存在公共前缀,则返回零。 ```c #include <stdio.h> #include <string.h> int longestCommonPrefix(const char *s1, const char *s2) { int length = 0; while(s1[length] && s2[length] && s1[length]==s2[length]) { length++; } return length; } int main() { const char str1[] = "hello"; const char str2[] = "helmet"; int result = longestCommonPrefix(str1, str2); printf("Longest Common Prefix Length: %d\n", result); return 0; } ``` --- #### 6. 排序算法工实现 动实现快速排序(QuickSort),不允许调用任何内置库函数。 ```c #include <stdio.h> void swap(int *a, int *b){ int t=*a; *a=*b; *b=t; } int partition(int array[], int low, int high){ int pivot=array[high]; int i=low-1; for(int j=low;j<high;j++){ if(array[j]<pivot){ i++; swap(&array[i],&array[j]); } } swap(&array[i+1], &array[high]); return(i+1); } void quicksort(int array[], int low, int high){ if(low<high){ int pi=partition(array,low,high); quicksort(array,low,pi-1); quicksort(array,pi+1,high); } } int main(){ int data[]={8,7,6,1,0,9,2}; int n=sizeof(data)/sizeof(data[0]); quicksort(data,0,n-1); printf("Sorted Array in Ascending Order:\n"); for(int i=0;i<n;i++) printf("%d ",data[i]); return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值