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 密码检查
描述
小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:
-
密码只能由大写字母,小写字母,数字构成;
-
密码不能以数字开头;
-
密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;
-
密码长度至少为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;
}