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

一个函数,两个(pos)整数k和n和1.打印所有长度为k的数字1-n 2的递增序列。返回数字序列

穆智刚
2023-03-14

下面是完整的问题:

问题3【30分】。编写一个包含两个正整数k和n的函数,其工作方式如下1。打印由数字1组成的长度k的所有递增序列。。。n 2。返回此类序列的数目。例如

int print_k_sequences( int n, int k)
For example, print_k_sequences( 5 , 3) prints the following sequences
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
and returns 10

打印序列的具体顺序由您决定。在数字之间加一个空格。别忘了用新行分隔序列。您的函数应该在合理的时间内对输入n、k进行处理,直到20。[提示:使用递归。您可能还想使用助手函数]

我的实现只打印第一个序列,然后停止。我哪里做错了?

//helper for printing array
void printArr( int arr[], int size){

    for(int i =0; i<size; i++)
    {
        printf("%d", arr[i] );
    }
    printf("\n");

    return;
}

int findSeq ( int arr[], int n, int k){

/* start from last index and find first elelment less than n if righmost element
is n then we have to incremenet arr value with 1 at starting index*/
    int p = k -1;
    while(arr[p == n])
    {
        p=0;
    }

    //  if the last element is the n and the difference of n and k is one greater
    // thant the first elelment that means last sequence is generated
    if(arr[k-1] ==n && (n-k) == arr[0]-1)
    {
        return 0;
    }

    /* else increase the value of array element till n*/
    arr[p] = arr[p] + 1;

    /* the nextr index value of array shoul always be greater than previous value */
    for (int i = p+1; i<k; i++)
    {
        arr[i] = arr[i-1] +1;
    }

    return 1;

}

int print_k_sequences(int n,int k) {
  // implement me

    int arr[k];

    int count = 0;

    /*values of first seq*/
    while (1){
        printArr(arr, k);

        count++;

        if(findSeq(arr, n, k) == 0)
        {
            break;
        }
    }

  return count;
}

这是测试它的代码:注意,主函数的任何参数都不能更改。

bool test_q3_1()  {
  int ans = print_k_sequences(6, 2);
  if (ans == 15)  {
    // need to also check the actual sequences
    printf("Q3-1 ok\n");
    return true;
  }
  else  {
    printf("Q3-2 ERROR: answer=%d, correct=15 \n", ans);
    return false;
  }
}

bool test_q3_2()  {
  int ans = print_k_sequences(8, 3);
  if (ans == 56)  {
    // need to also check the actual sequences
    printf("Q3-2 ok\n");
    return true;
  }
  else  {
    printf("Q3-2 ERROR: answer=%d, correct=56 \n", ans);
    return false;
  }
}

提前感谢!

共有1个答案

籍弘伟
2023-03-14

想出来了:)

如果有人遇到这个问题:

#include <stdio.h>

int numberOfSequences; // global variable to count number of sequences generated

// function to print contents of arr[0..k-1]
void OutputSequence(int arr[], int k) {
    for (int i = 0; i < k; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

// function to generate all increasing sequences from 1..n of length k
void generateSequence(int n, int k, int *len, int arr[]) {

    // If length of the array sequence becomes k
    if (*len == k) {
        numberOfSequences++; // we increment the counter by 1
        OutputSequence(arr, k); // and print that sequence
        return;
    }

    int i;
    // If length is 0, then start putting new numbers in the sequence from 1.
    // If length is not 0, then start from previous element +1.
    if (*len == 0)
        i = 1;
    else
        i = arr[*len - 1] + 1;

    // Increase length of the sequence so far
    (*len)++;

    // Put all numbers (which are greater than the previous element) at new position.
    while (i <= n) {
        arr[(*len) - 1] = i;    // adding the new element to the sequence
        generateSequence(n, k, len, arr);// generating the subsequent elements in the sequence
        i++;
    }

    (*len)--;
}

// driver function to print all increasing sequences from 1..n of length k
// and return the number of such sequences
int print_k_sequences(int n, int k) {
    int arr[k]; // array to store individual sequences
    int len = 0; // Initial length of current sequence
    numberOfSequences = 0; // counter to count number of sequences
    generateSequence(n, k, &len, arr);
    return numberOfSequences;
}

int main() {
    int k = 3, n = 5;
    printf("The sequences between 1.. %d  of length %d are:\n", n, k);
    int ans = print_k_sequences(n, k);
    printf("No of sequences= %d\n", ans);
    return 0;
}
 类似资料:
  • 这个问题是在谷歌编程采访中提出的。我想到了两种方法: > 找出长度的所有子序列。这样做时,计算两个元素的和,并检查它是否等于k。如果是,请打印“是”,否则继续搜索。这是一种暴力手段。 按非降序排列数组。然后从数组的右端开始遍历数组。假设我们有一个排序数组,{3,5,7,10},我们希望总和是17。我们将从元素10开始,索引=3,让我们用“j”来表示索引。然后包含当前元素并计算所需的_sum=sum

  • 给定一组未排序的整数,返回大小为k的所有子集(即每组有k个唯一元素),其总和为0。 所以我给了面试官以下解决方案(我在GeekViewpoint上研究过)。没有使用额外的空间,一切都做到位,等等。但当然成本是O(n^k)的高时间复杂度,其中在解决方案中。 但随后她提出了以下要求: 必须在答案中使用hashmap以降低时间复杂度 必须绝对地为一般情况提供时间复杂度 k=6时的提示,O(n^3) 她对

  • 给定一个数组大小n和一个正数max(max表示我们可以用来放置在数组中的数字范围)。 我想计算我可以在数组中放置多少个排序数字的组合。 例如: 如果n=3,则最大值为2。(我们只能使用1/2的数字,因为最大值是2)因此有4种排序数组组合 我编写了一些代码,并成功地通过了这个特定的示例,但任何其他示例 我发现的问题是,当递归到达最后一个索引时,它不会尝试第三个数字,而是向后折叠。 我的代码:

  • 我在阅读了允许K个异常的最长递增子序列后创建了这个线程。我意识到提问的人并没有真正理解这个问题,因为他指的是一个链接,该链接解决了“允许一次更改的最长递增子数组”问题。所以他得到的答案实际上与李的问题无关。 假设给定一个长度为N的数组A。查找允许K个异常的最长递增子序列。 示例:N=9,K=1 A=[3,9,4,5,8,6,1,3,7] 答案:7 说明: 最长递增子序列为:3,4,5,8(或6),

  • 我被困在这个练习中。 任务: 数字根是数字中所有数字的递归和。给定n,取n的位数之和。如果该值有多个位数,则以这种方式继续减少,直到生成一个位数。这只适用于自然数。 其工作原理如下: 数字根(16) 1 6=7 数字根(942) 9 4 2=15。。。1 5 =6 我的方法在这里。关于如何正确返回正确值的任何提示?我将不胜感激。