牛客网刷题记录

1、打印数组

描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

1.用返回一个整数列表来代替打印
2. n 为正整数,0 < n <= 5

示例1

输入:
1
返回值:
[1,2,3,4,5,6,7,8,9]

代码如下:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * @param n int整型 最大位数
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
static int a[100000];
int* printNumbers(int n, int* returnSize ) {
    // write code here
    int i = 0;
    int k = 0;
    switch(n)
    {
        case 1:
            k = 9;
            break;
        case 2:
            k = 99;
            break;
        case 3:
            k = 999;
            break;
        case 4:
            k = 9999;
            break;
        case 5:
            k = 99999;
             break;
        default:
            break;
    }
    for(i = 0;i < k;i++)
        a[i] = i+1;
    *returnSize=i;
    return a;
}

2、打印日期

描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。

进阶:时间复杂度:O(n) O(n)\ O(n) ,空间复杂度:O(1) O(1)\ O(1)

输入描述:
输入一行,每行空格分割,分别是年,月,日

输出描述:
输出是这一年的第几天

示例1

输入:
2012 12 31
输出:
366

代码:

#include <stdio.h>
int m[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

int main()
{
    int sum_day,day,year,month;
    scanf("%d %d %d",&year,&month,&day);
    if((year%4 == 0&&year%100!=0)||(year%400==0))
    {
        for(int i = 0;i < month;i++)
        {
            day += m[i];
        } 
        if(month > 2)
        {
            printf("%d",day+1);
        }
        else
        {
            printf("%d",day);
        }   
    } 
    else
    {
        for(int i = 0;i < month;i++)
        {
            day += m[i];
        }
        printf("%d",day);  
    }
    return 0;
}

2、请问下列表达式哪些会被编译器禁止【多选】()

int a = 248, b = 4;

int const *c = 21;

const int *d = &a;

int *const e = &b;

int const * const f = &a;
A: *c = 32; B:*d = 43 C:e=&a D:f=0x321f

题解:

const如果在指针变量的 *的左边【即 const int * a == int const * a】:

表达的意思是: 对指针变量a 解引用的值是保持不变的

    只有a里面存放的地址改变了,解引用出来的值才会变化

const如果在指针变量的 “ * ” 的右边【即 int * const a】

表达的意思是: a里面存放的地址是保持不变

   只有主动对 *a 赋值才能改变这个值,但a里面的地址是一直保持不变的

经过以上了解后,再看回题目:

   如果 const 位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量

   所以上题中的:*c 和 *d 不能变

   如果 const 位于 * 的右侧,则 const 就是修饰指针本身,即指针本身是常量

   所以上题中的: e和f的地址不能被改变

综上:A选项想改变*c的值就错了,B选项同理;e和f的地址不能被改变,所以C选项和D选项都错

4、JZ11 旋转数组的最小数字

描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

数据范围:1≤n≤100001 \le n \le 100001≤n≤10000,数组中任意元素的值: 0≤val≤100000 \le val \le 100000≤val≤10000
要求:空间复杂度:O(1)O(1)O(1) ,时间复杂度:O(logn)O(logn)O(logn)

/**
 * 
 * @param rotateArray int整型一维数组 
 * @param rotateArrayLen int rotateArray数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
    // write code here
    int min = rotateArray[0] ,i;
    for(i = 0;i<rotateArrayLen;i++)
    {
        if(rotateArray[i] < min)
            min = rotateArray[i];        
    }
    return min;
}

5、冒泡排序算法

描述
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、“a"到"z”、"0"到"9"表示。

数据范围:每组输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000

输入描述:
一行,一个字符串,字符串中的每个字符表示一张Lily使用的图片。

输出描述:
Lily的所有图片按照从小到大的顺序输出

示例1

输入:
Ihave1nose2hands10fingers
复制
输出:
0112Iaadeeefghhinnnorsssv

冒泡代码实现

#include <stdio.h>
#include <string.h>
//超级冒泡
int main()
{
    char a[1025] = {0};
    scanf("%s",a);
    int len = strlen(a);
    for(int i = 0;i<len-1;i++)
    {
        for(int j = i+1;j<len;j++)
        {
            if(a[i]>a[j])
            {
                char temp = '\0';
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    printf("%s\n",a);
    return 0;    
}

6、哈希表实现字符统计

【牛客网题号: HJ10 字符个数统计】【难度:简单】
1、 编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次

例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3

数据范围: 0 <= n <= 500

输入描述: 输入一行没有空格的字符串

输出描述: 输出 输入字符串 中范围在(0~127,包括0和127)字符的种数

非常巧妙的方法:


#include <stdio.h>
#include <string.h>
int main()
{
    char arr[501] = {'\0'};
    int table[128] = {0};
    int sum = 0;
    scanf("%s",arr);
    	for (int i = 0; i < strlen(arr); ++i)
    	{
        	table[arr[i]]++;//把字符对应的ascii码作为下标
    	}
    	for(int i = 0; i < 128; ++i)
    	{
        	if(table[i])
        	{
        		sum++;
        	}
        }
        printf("%d",sum);
    return 0;
}

7、OR141 密码检查

描述
小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:

  1. 密码只能由大写字母,小写字母,数字构成;

  2. 密码不能以数字开头;

  3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;

  4. 密码长度至少为8

现在小明受到了n个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的。

输入描述:
输入一个数n,接下来有n(n≤100)行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过100。
输出描述:
输入n行,如果密码合法,输出YES,不合法输出NO
示例1
输入:
1
CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR
输出:
YES

#include <stdio.h>
#include <string.h>
int main()
{ 
    int n = 0;
    while(~scanf("%d",&n))
    {
        for(int i = 0; i < n; i++)
        {
            char pwd[101] = {0};
            
            scanf("%s",pwd);
            
            int lower = 0,higher = 0,digit = 0,other = 0;
            
            if(pwd[0] >= '0' && pwd[0] <= '9')
            {
                printf("NO\n");
                continue;
            }
            if(strlen(pwd) < 8)
            {
                printf("NO\n");
                continue;
            }
            for(int i = 0; pwd[i] != '\0'; i++)
            {
                if(pwd[i] >= '0' && pwd[i] <= '9')
                    digit++;//数字
                else if(pwd[i] >= 'a' && pwd[i] <= 'z')
                    lower++;//小写字母
                else if(pwd[i] >= 'A' && pwd[i] <= 'Z')
                    higher++;//大写字母
                else
                    other++;
            }

            if(other != 0)
            {
                printf("NO\n");
                continue;
            }
           
            if((lower > 0) + (higher > 0) + (digit > 0) < 2)
            {
                printf("NO\n");
                continue;
            }
                printf("YES\n");
         }
    }
    return 0;
}

8、my_cpy

在这里插入图片描述

#include <stdio.h>

char* strcpy(char *strDest, const char* strSrc)
{
	char *p=NULL;
	if(strDest == NULL || strSrc == NULL)
	{
		return NULL;
	}
	p= strDest;
	while((*strDest++ = *strSrc ++) != '\0');
	return p;
}

9、BM50 两数之和

在这里插入图片描述答案:冒泡排序法的变种

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param numbers int整型一维数组 
 * @param numbersLen int numbers数组长度
 * @param target int整型 
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */



static int res[2];
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
    // write code here
    
    int i = 0;
    int j = 0;
    *returnSize = 2;
    for(i = 0;i<numbersLen;i++)
    {
        if(numbers[i] > target)
            continue;
        for(j = i+1;j<numbersLen;j++)
        {
            if(numbers[i] + numbers[j] == target)
            {
                 res[0] = i+1;
                res[1] = j+1;
                
            }
               
        }
    }
    
    return res;
   
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值