CSDN每日一练20230228(小艺改编字符串)

题目名称:求最小元素

题目描述

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]). Find the minimum element. You may assume no duplicate exists in the array. (注意:测试用例仅做参考,我们会根据代码质量进行评分)

输入描述:

第一行输入整数n。(1<=n<=10000)表示数组的大小 第二行给出n个整数a.(0<=a<=1e9)

输出描述:

输出答案

示例

输入
5
3 4 5 1 2
输出
1

就是找最小值,数组是乱序的,二分法也用不了,也没感觉有比for循环更快的了

#include <stdio.h>
#include <stdlib.h>
int cmp(const void*pa,const void*pb) {
	int a=*(int*)pa;
	int b=*(int*)pb;
	if(a>b) {
		return 1;
	} else {
		return 0;
	}
}
void solution(int n, int arr []) {
	qsort(arr,n,sizeof(n),cmp);
	printf("%d",arr[0]);
}
int main() {
	int n;
	scanf("%d", &n);
	int* arr;
	arr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	solution(n, arr);
	return 0;
}

题目名称:韩信点兵

题目描述

韩信是中国古代伟大的军事家和统帅,他有一种独特的点兵方法:每个军队由若干个士兵组成,并且每个士兵有一个编号。 当韩信需要点兵时,他会给定一个正整数 K K K,表示点兵的人数。然后他会按照如下方式点兵: 1. 首先将所有士兵排成一列,编号依次为 1 , 2 , 3 , . . . , n 1,2,3,...,n 1,2,3,...,n。 2. 从第 1 1 1 个士兵开始,每隔 K K K 个士兵,就取出一个士兵。 例如,当 n = 10 n=10 n=10 k = 3 k=3 k=3 时,韩信会按照以下方式点兵: 1 4 7 10 你的任务是,给定 n n n k k k,求出韩信点兵的顺序。

输入描述:

第一行包含两个整数 n n n k k k,其中 n n n 表示士兵的数量, k k k 表示点兵的人数。

输出描述:

输出一行,包含 n n n 个整数,表示韩信点兵的顺序。

示例

输入 10 3
输出 1 4 7 10

完全不懂什么意思
搜到的都是余数问题,跟此题完全不搭边

题目名称:小艺改编字符串

题目描述

已知字符串str. 添加至少多少字符可以使得str变成回文串。

输入描述:

输入字符串s.(1<=len(str)<=100)

输出描述:

输出最小需要添加字符的数量。

示例

输入 abab
输出 1

比赛中出现的题目,基于回文判断的基础上,如果左右不一致,此时要往左边加字符或者右边加字符,要基于这2种情况递归。
使用数组缓存要追加字符的个数,否则会超时

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int tmpdata[1024][1024];
int min(int a,int b) {
	if(a<b) {
		return a;
	} else {
		return b;
	}
}
int check(char*s,int len,int left,int right) {
	if(tmpdata[left][right]>0) {
		return tmpdata[left][right];
	}
	while(s[left]==s[right]&&left<right) {
		left++;
		right--;
	}
	int count=0;
	if(left<right) {
		//左边补位
		int a=1+check(s,len,left,right-1);
		int b=1+check(s,len,left+1,right);
		count=min(a,b);
	}
	tmpdata[left][right]=count;
	return count;
}
void solution(char *s) {
	int len=strlen(s);
	int ret=check(s,len,0,len-1);
	printf("%d",ret);
}
int main() {
	char s[1024]= {0};
	scanf("%s", s);
	memset(tmpdata,0,sizeof(int)*1024*1024);
	solution(s);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值