当前位置: 首页 > 知识库问答 >
问题:

数组:在C中向左旋转

慕光霁
2023-03-14

https://www.hackerrank.com/challenges/ctci-array-left-rotation

对大小为 n 的数组执行左旋转操作会将数组的每个元素向左移动 1 个单位。例如,如果在数组 [1,2,3,4,5] 上执行 2 次左旋转,则数组将变为 [3,4,5,1,2]

执行 k 次旋转并打印。

这是我到目前为止得到的,但它只经过一次交互,看不出我做错了什么

int main(){
   int n; //size
   int k; //number of rotations
   int a_i; //index
   scanf("%d %d",&n,&k);
   int *a = malloc(sizeof(int) * n); //input array
   for(a_i = 0; a_i <= n; a_i++){
      scanf("%d",&a[a_i]);
   }

int temp;
for(a_i = 0; a_i <= k; a_i++){
    temp = a[0];
    for(a_i = 0; a_i < n-1; a_i++) {
        a[a_i] = a[a_i+1];
    }
    a[a_i] = temp;   
}

for(a_i = 0; a_i < n; a_i++){
    printf("%d ", a[a_i]);
}


return 0;
}

共有3个答案

魏俊茂
2023-03-14

试试这段代码,将数组向左旋转d次,这段代码对你有帮助!!

import java.util.ArrayList;
import java.util.Scanner;
/**
 *
 * @author Bilakhiya
 */
public class LeftRotate {

    /**
     * @param args the command line arguments
     */

    static ArrayList<Integer> leftarray(ArrayList<Integer>A1,int n,int d)
    {
        for(int j=0;j<d;j++)
        {
           leftby1(A1,n);

        }
        return A1;
    }
    static ArrayList<Integer> leftby1(ArrayList<Integer>A1,int n)
    {
        int i,temp;
        temp=A1.get(0);
        for(i=0;i<n-1;i++)
        {
            A1.set(i,A1.get(i+1) );
        }
        A1.set(i,temp);
        return A1;
    }
    public static void main(String[] args) {
        // TODO code application logic here
      ArrayList<Integer> A=new ArrayList<>();
      Scanner sc=new Scanner(System.in);
      int n=sc.nextInt();
      int d=sc.nextInt();
      for(int i=0;i<n;i++)
      {
          A.add(sc.nextInt());
      } 
      ArrayList<Integer> B=leftarray(A,n,d);
      for(int i=0;i<n;i++)
      {
          System.out.print(B.get(i)+" ");
      }      
    }   
}
尉迟卓
2023-03-14

你的循环是这样的

   for(a_i=0; a_i<k; a_i++)
{

    int temp=a[0];
        for(a_j=0; a_j<n-1; a_j++)
        {
        a[a_j] = a[a_j+1];
         }
    a[n-1] = temp;

   }
   for(a_i=0 ; a_i<n ; a_i++)
   {

    printf("%d ",a[a_i]);

   }
岳宣
2023-03-14

如果有一个包含< code>n个元素的数组,那么访问数组元素的有效索引范围是< code>[0,n-1]。

因此,在大多数情况下,程序中的循环使用无效的索引范围。

此外,您正在使用相同的变量a_i用于两个嵌套循环,这将为外部循环提供不正确的索引

for(a_i = 0; a_i <= k; a_i++){
    temp = a[0];
    for(a_i = 0; a_i < n-1; a_i++) {
        a[a_i] = a[a_i+1];
    }
    a[a_i] = temp;   
}

还有这个说法

for(a_i = 0; a_i <= k; a_i++){

设置 k 1 次迭代,而不是 k 次迭代。

 类似资料:
  • 描述 (Description) 它提供移动或导致围绕轴或中心的圆圈移动。 语法 (Syntax) @keyframes rotateOutUpLeft { 0% { transform-origin: left bottom; transform: rotate(0); opacity: 1; } 100% { -tran

  • 描述 (Description) 它提供移动或导致围绕轴或中心的圆圈移动。 语法 (Syntax) @keyframes rotateOutDownLeft { 0% { transform-origin: left bottom; transform: rotate(0); opacity: 1; } 100% { transfo

  • 描述 (Description) 它提供移动或导致围绕轴或中心的圆圈移动。 语法 (Syntax) @keyframes rotateIn { 0% { transform-origin: center center; transform: rotate(-200deg); opacity: 0; } 100% { t

  • 描述 (Description) 它提供移动或导致围绕轴或中心的圆圈移动。 语法 (Syntax) @keyframes rotateInDownLeft { 0% { transform-origin: left bottom; transform: rotate(-90deg); opacity: 0; } 100% { tra

  • 问题内容: 在一个程序中,我正在写一个旋转二维数组的需求。在寻找最佳解决方案时,我发现了这种令人印象深刻的一线功能: 我现在在程序中使用它,它按预期工作。我的问题是,我不了解它是如何工作的。 如果有人可以解释所涉及的不同功能如何实现所需的结果,我将不胜感激。 问题答案: 考虑以下二维列表: 让我们将其逐步分解: 此列表传递给使用参数unpacking,因此调用最终等效于此: 希望注释能够清楚说明其

  • 问题内容: 我正在使用Postgres 9.3。 我有两个表 以及它们之间的关系。现在,我想创建一个视图,该视图除了T1的列外,还为T1中的每个记录提供一列,其中包含一个包含T2所有相关记录的主键ID的数组。如果T2中没有相关条目,则此列的相应字段应包含空值。 我的架构的抽象版本如下所示: 可以如下生成相应的样本数据: 到目前为止,我提出了以下查询: 这行得通。但是,可以简化吗? 可以在此处找到相