C语言,轮转数组

9 篇文章 1 订阅

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

来源:LeetCode

不是很难的一道题。

解这道题关键在于轮转移动,轮转移动可以采用下面的方法:

将一行轮转左移k位。

因为n有可能大于数组中元素的个数,所以首先k要对数组中元素个数numsSize取余,即k %= numsSize。

然后首先将第一位到第k位首尾交换,然后将第k+1位到最后一位首尾交换,

最后将交换后的第一位到最后一位首位交换。经此操作后即可得到轮转左移后的一行。

其他轮转移动同理。

void reverse(int *nums,int i,int j)
{
    while(j > i)
    {
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
        j--;
        i++;
    }
}
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);
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时间片轮转算法是一种常见的进程调度算法,它的基本思想是将所有处于就绪状态的进程按照先后顺序排成一个队列,然后每个进程按照一定的时间轮流占用CPU。当一个进程用完它分配的时间片后,它就会被移到队列的末尾,等待下一次调度。 下面是一个简单的C语言实现时间片轮转算法的例子: ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct process { int pid; // 进程ID int burst_time; // 进程执行时间 int remaining_time; // 进程剩余执行时间 int arrival_time; // 进程到达时间 int waiting_time; // 进程等待时间 int turnaround_time; // 进程周转时间 }; void calculate_waiting_time(struct process *procs, int n, int quantum) { int total_time = 0; // 总执行时间 int remaining_procs = n; // 剩余未执行进程数 int current_time = 0; // 当前时间 int i, j; // 计算剩余执行时间 for (i = 0; i < n; i++) { procs[i].remaining_time = procs[i].burst_time; } // 时间片轮转 while (remaining_procs > 0) { for (i = 0; i < n; i++) { if (procs[i].remaining_time <= 0) { continue; } if (procs[i].remaining_time > quantum) { // 执行一个时间片 current_time += quantum; procs[i].remaining_time -= quantum; } else { // 执行完整个进程 current_time += procs[i].remaining_time; procs[i].remaining_time = 0; remaining_procs--; // 计算等待时间和周转时间 procs[i].turnaround_time = current_time - procs[i].arrival_time; procs[i].waiting_time = procs[i].turnaround_time - procs[i].burst_time; if (procs[i].waiting_time < 0) { procs[i].waiting_time = 0; } total_time += procs[i].waiting_time; } } } // 计算平均等待时间 double avg_waiting_time = (double) total_time / n; printf("Average waiting time: %.2f\n", avg_waiting_time); } int main() { // 创建进程数组 int n = 5; struct process procs[] = { {1, 6, 0, 0, 0, 0}, {2, 8, 0, 1, 0, 0}, {3, 7, 0, 2, 0, 0}, {4, 3, 0, 3, 0, 0}, {5, 4, 0, 4, 0, 0} }; // 计算等待时间 int quantum = 3; calculate_waiting_time(procs, n, quantum); return 0; } ``` 这个例子中,我们定义了一个进程结构体,它包含进程的ID、执行时间、剩余执行时间、到达时间、等待时间和周转时间。然后,我们实现了一个`calculate_waiting_time`函数,它采用时间片轮转算法计算每个进程的等待时间和周转时间,并最终计算出平均等待时间。在`main`函数中,我们创建了一个包含5个进程的进程数组,并调用`calculate_waiting_time`函数计算等待时间,时间片长度为3个时间单位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值