大家好我是沐曦希💕
给大家介绍一款超牛的斩获大厂offer利器——牛客网

题目链接:HJ34 图片整理

这道题考察的其实就是字符排序,每个 ascii 字符在内存都有一个对应的 ascii 值,通过内存中数据的存储进行排序就行。
冒泡排序:相邻数据之间进行比较交换,将较大或较小的数据向后推到数组末尾,然后开始下一轮次大数据的冒泡过程。
//code1
#include
#include
int cmp(const void* e1, const void* e2)
{
return (*(char*)e1 - *(char*)e2);
}
int main()
{
char arr[1001];
gets(arr);
int len = strlen(arr);
qsort(arr,len,1,cmp);
printf("%s\n",arr);
return 0;
}
//code2
#include
int main()
{
char str[1024] = {0};
while(gets(str))
{
int len = strlen(str);
for (int i = 0; i < len; i++)
{
for (int j = 1; j < len - i; j++)
{
if (str[j] < str[j - 1])
{
char ch = str[j - 1];
str[j - 1] = str[j];
str[j] = ch;
}
}
}
printf("%s\n", str);
}
return 0;
}
题目链接:JZ53 数字在升序数组中出现的次数

暴力破解:双重循环遍历数组,对每个元素判断是否是其他元素的两倍。或者先遍历一遍找出最大值,然后遍历一遍判断是否是其他数字二倍。
更优思想:一次遍历找出最大的数字和次大的数字,判断最大的数字是否是次大数字2倍即可。
int dominantIndex(int* nums, int numsSize){
if (numsSize == 1) return 0;//特殊情况只有一个元素则特殊处理
int max, sec, idx;
//先对最大和次大进行选择赋值,注意max和sec不能随意赋初值,因为有可能你赋予的初值就是最大值
//因此要使用数组中的数据进行初值赋予。
if (nums[0] > nums[1])
{
max = nums[0];
idx = 0;
sec = nums[1];
}
else
{
max = nums[1];
idx = 1;
sec = nums[0];
}
for (int i = 2; i < numsSize; i++)
{
if (nums[i] > max)
{ //当前元素大于max,则意味着要替换
sec = max; //先将原先最大的保存到sec中,则他就是次大的
max = nums[i]; //再将最大的放到max中
idx = i; //保存max值的下标
}
else if (nums[i] > sec)
{
//避免刚好nums[0]就是最大的情况,因为不切换最大而导致次大无法判断情况
sec = nums[i];
}
}
if (max >= sec * 2)
{
return idx;
}
return -1;
}
题目链接:OR141 密码检查

这道题只需要将字符串从头到尾的每种字符(大写字符,小写字符,数字,其他字符)分别统计出来后。然后逐个判
断是否符合条件即可。而条件的判断包含有:
1.长度不小于8
2.不能以数字开头
3.只能包含字母和数字
4.大小写和字符必须具备两种以上
#include
int main(void)
{
int n,i,j,a=0,b=0,c=0;
scanf("%d",&n);
char arr[100];
for(i=0;i<n;i++)
{
scanf("%s",&arr);
if(strlen(arr) < 8)
{
printf("NO\r\n");
continue;
}
if(isdigit(arr[0]) != 0)
{
printf("NO\r\n");
continue;
}
for(j=1;j<100;j++)
{
if(islower(arr[j]) != 0)
{
a++;
}
if(isupper(arr[j] != 0))
{
b++;
}
if(isdigit(arr[i]) != 0)
{
c++;
}
}
if(a == sizeof(arr) || b == sizeof(arr) || c == sizeof(arr))
{
printf("NO\r\n");
continue;
}
printf("YES\r\n");
}
return 0;
}
那么就到这里了。
