• c刷题[6]


    目录

    杨辉三角

    杨氏矩阵

    字符串左旋

    判断字符串 

    公务员面试

    改数字

    数字三角形

    输出不重复序列


    杨辉三角

    在屏幕上打印杨辉三角

    先转化成二维数组:

    1

    1 1

    1 2 1

    1 3 3 1

    规律:每行第一个元素和最后一个元素为1(主对角),从第三行开始,中间元素等于左上方元素和正上方元素相加。

    1. int arr[10][10] = { 0 };
    2. int i = 0;
    3. int j = 0;
    4. for (i = 0; i < 10; i++)
    5. {
    6. for (j = 0; j <= i; j++)//打印一半三角即可
    7. {
    8. if (j == 0 || i == j)
    9. arr[i][j] = 1;
    10. else
    11. {
    12. arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
    13. }
    14. }
    15. }
    16. for (i = 0; i < 10; i++)
    17. {
    18. for (j = 0; j < 10-i; j++)
    19. {
    20. printf(" ");
    21. }
    22. for (j = 0; j <= i; j++)
    23. {
    24. printf("%2d ", arr[i][j]);
    25. }
    26. printf("\n");
    27. }

    打印效果:

    杨氏矩阵

    有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

    要求:时间复杂度小于O(N);

    1. bool find_square_n(int(*arr)[3], int* r, int* c, int n)
    2. {
    3. //按行找
    4. int i = 0;
    5. int j = *c - 1;
    6. while (i < *r && j >= 0)
    7. {
    8. if (n > arr[i][j])
    9. i++;
    10. else if (n
    11. < arr[i][j])
    12. j--;
    13. else
    14. {
    15. *r = i;//返回型参数
    16. *c = j;
    17. return true;
    18. }
    19. }
    20. return false;
    21. }

    如果我们想一次性返回多个值,不如传递实参的地址过去,通过返回型参数实现多个值的返回。

    测试:

    字符串左旋

    实现一个函数,可以左旋字符串中的k个字符。

    例如:

    ABCD左旋一个字符得到BCDA

    ABCD左旋两个字符得到CDAB

    方法一:
    每次旋转一个字符,其他元素依次往前移。

    1. void left_spin(char* arr, int k)
    2. {
    3. assert(arr);
    4. int len = strlen(arr);
    5. assert(len);//0不能做余数且旋转无意义
    6. k %= len;//避免重复旋转
    7. for (int i = 0; i < k; i++)
    8. {
    9. int tmp = arr[0];//接收旋转元素
    10. for (int j = 0; j -1;j++ )//从前往后
    11. arr[j] = arr[j + 1];
    12. arr[len - 1] = tmp;
    13. }
    14. }

    右旋与左旋差不多,如果左旋k次,向右旋转len-k次即可。  

    方法二:

    逆序前k个数和后len-k个数,然后整体逆序 

    1. void reverse(char*left, char*right)
    2. {
    3. assert(left && right);
    4. while (left < right)
    5. {
    6. char tmp = *left;
    7. *left = *right;
    8. *right = tmp;
    9. left++;
    10. right--;
    11. }
    12. }

    测试: 

    判断字符串 

    写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

    例如:给定s1 =AABCD和s2 = BCDAA,返回1

    给定s1=abcd和s2=ACBD,返回0.

    AABCD左旋一个字符得到ABCDA

    AABCD左旋两个字符得到BCDAA

    AABCD右旋一个字符得到DAABC

    方法一:逐个旋转对比

    1. bool is_str(char* arr1, const char* arr2)
    2. {
    3. int len = strlen(arr2);
    4. assert(arr1 && arr2);
    5. for (int i = 0; i < len; i++)
    6. {
    7. int tmp = arr1[0];//接收旋转元素
    8. for (int j = 0; j < len - 1; j++)//从前往后
    9. arr1[j] = arr1[j + 1];
    10. arr1[len - 1] = tmp;
    11. if (strcmp(arr1, arr2) == 0)
    12. {
    13. return true;
    14. }
    15. }
    16. return false;
    17. }

    测试: 

     

    方法二:

    在原字符串后补上源字符串,再查找是否存在相应的字串。

    ABCDEFABCDEF

    例:

    CDEFAB -——>ABCDEFABCDEF

    EFABCD——->ABCDEFABCDEF

    1. bool is_str(char* arr1, const char* arr2)
    2. {
    3. assert(arr1 && arr2);
    4. int len1 = strlen(arr1);
    5. int len2 = strlen(arr2);
    6. assert(len1 - len2 == 0);//长度是否相等
    7. strncat(arr1, arr1, len1);//,注意arr1有充足空间,不能用strcat
    8. char* arr = strstr(arr1, arr2);
    9. if (arr == NULL)
    10. return false;
    11. else
    12. return true;
    13. }

    公务员面试

    公务员面试_牛客题霸_牛客网

    这道题不难,主要想说的是多组输入如果遇到输入过多数据该怎么解决:
    我们可以一个数据一个数据地读入并执行相关操作,直到输入个数为要求的个数时再进行结果输出,缺陷就是必须输入完一组数据得重置变量

    1. #include
    2. int main()
    3. {
    4. int max = 0, min = 100;
    5. int sum=0,score,count=0;
    6. while (scanf("%d", &score) != EOF)
    7. {
    8. if (max < score)
    9. max = score;
    10. if (min > score)
    11. min = score;
    12. sum += score;
    13. if (++count == 7)
    14. {
    15. printf("%.2f\n",(sum-max-min)/5.0);
    16. max=0;
    17. score=0;
    18. min=100;
    19. count=0;
    20. sum=0;
    21. }
    22. }
    23. return 0;
    24. }

    改数字

    小乐乐改数字_牛客题霸_牛客网

    方法一:使用pow函数

    1. #include
    2. #include
    3. int main() {
    4. int sum = 0;
    5. int n;
    6. int i = 0;
    7. scanf("%d",&n);
    8. while(n)
    9. {
    10. int ret = n%10%2;
    11. if(ret==1)
    12. {
    13. sum+=1 * (int)pow(10,i);
    14. }
    15. n/=10;
    16. i++;
    17. //偶数啥也不做
    18. }
    19. printf("%d",sum);
    20. return 0;
    21. }

     方法二,使用递归:
     

    1. int modify(int n)
    2. {
    3. if(n/10==0)
    4. {
    5. return n%2;
    6. }
    7. else {
    8. {
    9. return modify(n/10)*10 + n%2;//偶数取决于最后一位
    10. }
    11. }
    12. }

    数字三角形

    按行: 

    1. #include
    2. int main()
    3. {
    4. int n = 0;
    5. //多组输入
    6. while (~scanf("%d", &n))
    7. {
    8. //控制行数
    9. for (int i = 1; i <= n; i++)
    10. {
    11. //打印一行
    12. for (int j = 1; j <= i; j++)
    13. {
    14. printf("%d ", j);
    15. }
    16. printf("\n");
    17. }
    18. }
    19. return 0;
    20. }

    除了按行输出,我还发现每列也有规律,于是试着自己去实现了一下:

    1. #include
    2. #include
    3. int main() {
    4. int n;
    5. while(scanf("%d",&n))
    6. {
    7. int num = 1;
    8. int arr[n][n];//不会初始化
    9. // memset(arr,0,(n*n)* sizeof(int));//
    10. for(int i = 0;i//存放于数组
    11. {
    12. for(int j = i;j< n;j++)
    13. {
    14. arr[j][i] = num;
    15. }
    16. num++;
    17. }
    18. for (int i = 0; i < n; i++)
    19. {
    20. //打印一行
    21. for (int j = 0; j <= i; j++)
    22. {
    23. printf("%d ", arr[i][j]);
    24. }
    25. printf("\n");
    26. }
    27. }
    28. }

    输出不重复序列

    小乐乐与序列_牛客题霸_牛客网

    创建一个数组,初始化为0。将对应大小的数字放入对应的下标,然后输出非0的数组元素。

    静态版本: 

    1. #include
    2. int main() {
    3. int arr[100001] = {0};//初始化
    4. int n;
    5. int num;
    6. scanf("%d",&n);
    7. for(int i = 0;i
    8. {
    9. scanf("%d",&num);
    10. arr[num] = num;
    11. }
    12. for(int i = 0;i<100001;i++)
    13. {
    14. if(arr[i] !=0)
    15. {
    16. printf("%d ",arr[i]);
    17. }
    18. }
    19. return 0;
    20. }

    C99标准:

    1. #include
    2. int main() {
    3. int n;
    4. scanf("%d",&n);
    5. int arr[n];
    6. memset(arr,0,n*sizeof(int));
    7. int num;
    8. for(int i = 0;i
    9. {
    10. scanf("%d",&num);
    11. arr[num-1] = num;//从0开始以便放下所有数据
    12. }
    13. for(int i = 0;i
    14. {
    15. if(arr[i] !=0)
    16. {
    17. printf("%d ",arr[i]);
    18. }
    19. }
    20. return 0;
    21. }

  • 相关阅读:
    网络安全-终端防护设备
    10 个 Python 自动探索性数据分析神库!
    【每日一题】2558. 从数量最多的堆取走礼物-2023.10.28
    mysql高级
    周公解梦|做梦的解释|鬼压床|为什么会做梦
    Java面试题整理Java基础部分
    APC学习记录
    【CGE】“双碳”目标下资源环境中的可计算一般均衡CGE模型应用
    一次磁盘占用率 100% 的排查记录
    065:mapboxGL在一个图层中随机添加100个标记(marker)
  • 原文地址:https://blog.csdn.net/dwededewde/article/details/133617512