算法题
我还是学习吧
这个作者很懒,什么都没留下…
展开
-
C语言练习——在一个数组中有两个数组只出现1次,其余数字都是出现两次,写函数找出这两个数字
.哎原创 2021-09-26 15:16:40 · 147 阅读 · 0 评论 -
C语言练习——判断整数序列是否有序
题解法一先用i按两个数字判断是递增还是递减,再判断是否有序缺点是没法处理存在相等元素的情况#include<stdio.h>int main(){ int arr[50] = { 0 }; int n; scanf("%d", &n); int i; for (i = 0; i < n; i++) { scanf("%d", arr + i); } if (arr[0] < arr[1]) { for (i = 0; i < n.原创 2021-09-08 21:09:42 · 628 阅读 · 0 评论 -
C语言练习题——再整数序列删除指定整数,原数据顺序不变
题解法一找下标,先实现删除一个数,再循环#include<stdio.h>int find(int* arr, int length,int num)//用一个函数来找到要删除元素的下标{ int i; for (i = 0; i < length; i++) { if (arr[i] == num) return i; } return -1;}int main(){ int arr[50] = { 0 }; //数据输入部分 int le.原创 2021-09-08 21:05:42 · 471 阅读 · 0 评论 -
C语言练习题——合并两个升序序列为一个升序序列
题解法一先创建两个数组接收数据再把两个数组合并最后排序#include<stdio.h>#include<stdlib.h>int main(){ //使用malloc int a, b; scanf("%d %d", &a, &b); int* p1 = (int*)malloc(a * sizeof(int)); int* p2 = (int*)malloc(b * sizeof(int)); int i; for (i = 0; .原创 2021-09-08 20:59:10 · 3141 阅读 · 0 评论 -
编写代码完成如下功能:删除字符串首尾的空格,中间的连续空格只留一个,原来字符串的顺序不变。 如 “*****as****adadq*****”(*是空格) 变成 “as*aadadq”
题目编写代码完成如下功能:删除字符串首尾的空格,中间的连续空格只留一个,原来字符串的顺序不变。如 “as****adadq”(是空格) 变成 “asaadadq”答案#include<stdio.h>void fun(char* str){ int i;//str用于遍历,pstr用于得到目标字符串,二者指向的是同一段字符串,但是pstr移动的比str慢 char* pstr = str;//i的移动是不慢于str的,pstr要满足一定条件才自加,但是i每次循环都会加1原创 2021-08-20 08:27:41 · 181 阅读 · 0 评论 -
字符串压缩. 输入字符串只包含 a-z 字母以及结束标志,请编写函数实现对连续出现的相同字符进行压缩,例 如: ”xxxyyyyz” 压缩后字符串为 ”3x4yz” , ”yyyyyyy” 压缩后为
题目字符串压缩. 输入字符串只包含 a-z 字母以及结束标志,请编写函数实现对连续出现的相同字符进行压缩,例如: ”xxxyyyyz” 压缩后字符串为 ”3x4yz” , ”yyyyyyy” 压缩后为 ”7y”答案#include<stdio.h>#include<string.h>void fun(char* const str)//str的指向的地址不变,指向的内容可变{ int len = strlen(str); int hash[128] = { 0原创 2021-08-19 19:26:43 · 241 阅读 · 2 评论 -
如何判断一个数n是否是2的k次方?注意:不用求K是多少,只需要判断,请编写函数实现
题目如何判断一个数n是否是2的k次方?注意:不用求K是多少,只需要判断,请编写函数实现答案#include<stdio.h>int check(int n)//是就返回1否则返回0{ int count = 0; while (n) { count++; n = n & (n - 1); } if (1 == count) return 1; else return 0;}int main(){ int n; while (scanf(原创 2021-08-19 17:39:20 · 192 阅读 · 0 评论 -
求一个有序数组中两个元素值相加为k的数字,返回这两个元素的下标。要求时间复杂度是O(n),空间复杂度O(1)
题目求一个有序数组中两个元素值相加为k的数字,返回这两个元素的下标。要求时间复杂度是O(n),空间复杂度O(1)答案#include<stdio.h>void fun(int* arr, int sz, int n){ int left = 0; int right = sz - 1; int sum = 0; while (left < right)//和前面二维有序数组找数字相似,关键是利用顺序从特定值开始 { sum = arr[left] + arr[r原创 2021-08-19 17:15:57 · 138 阅读 · 0 评论 -
编写一个函数,求一个数字是否是回文数。回文数概念:给定一个数,这个数顺读和逆读都是一样的。例如: 121,1221是回文数,123,1231不是回文数
题目编写一个函数,求一个数字是否是回文数。回文数概念:给定一个数,这个数顺读和逆读都是一样的。例如:121,1221是回文数,123,1231不是回文数。答案#include<stdio.h>int fun(int x)//回文数返回1,否则返回0{ if (x < 0)//思路是把数字逆置后再比较 return 0; int i = x, k = 0; while (i > 0) { k = k * 10 + i % 10; i = i / 10原创 2021-08-19 16:35:32 · 530 阅读 · 0 评论 -
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入 ”They are students.” 和 ”aeiou” ,则删除之后的第一个字符串变成 ”Thy r stdnts.”
题目输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入 ”They arestudents.” 和 ”aeiou” ,则删除之后的第一个字符串变成 ”Thy r stdnts.”答案#include<stdio.h>#include<string.h>char* fun(char* const src, const char* const dest)//src指向位置不变,但是src的内容会改变{ int destlen = strlen(de原创 2021-08-19 16:08:54 · 962 阅读 · 0 评论 -
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。例如数组 为{1,3,5,7,1,3,5,9},找出7和9
题目一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。例如数组为{1,3,5,7,1,3,5,9},找出7和9答案#include<stdio.h>void fun(int arr[],int sz){ unsigned int Hash[10] = { 0 };//下标代表数字,内容代表出现次数,这里只能处理一位数 int i; int* parr = arr; for (i = 0; i < sz; i++) {原创 2021-08-19 14:22:06 · 121 阅读 · 0 评论 -
对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。测试样例: “qywyer23tdd“ , 返回: y
题目对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。测试样例: “qywyer23tdd” , 返回: y答案#include<stdio.h>#include<assert.h>char fun(const char* str){ assert(str!=NULL);//处理传入空指针的情况,还没处理传入一个只有'\0'的情况 unsigned int Hash[256] = { 0 };//Hash的下标代表字符,内容代表出现次数 const原创 2021-08-19 14:00:29 · 297 阅读 · 0 评论 -
在字符串中找出第一个只出现一次的字符。如输入 “abaccdeff“ ,则输出 ‘b‘ 。要求时间复杂度为 O(n)
题目在字符串中找出第一个只出现一次的字符。如输入 “abaccdeff” ,则输出 ‘b’ 。要求时间复杂度为 O(n)。答案#include<stdio.h>#include<assert.h>char fun(const char* str){ assert(str!=NULL);//处理传入空指针的情况,还没处理传入一个只有'\0'的情况 unsigned int Hash[256] = { 0 };//Hash的下标代表字符,内容代表出现次数 const原创 2021-08-19 13:56:27 · 100 阅读 · 0 评论 -
输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的 最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最
题目输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18答案#include<stdio.h>//原则时从正数开始,字串可以有负数,加出来的字串可以看成一个数,只要还是正数就往下加,加成了负数可以看成这时一个开头为负数的字串,所以要改变首元素int find(int*原创 2021-08-19 13:30:06 · 1158 阅读 · 0 评论 -
编写函数: 求数组中元素出现次数超过数组长度一半的数字。如: {1,2,3,2,2,2,5,4,2} 数字 2 为超过数组长度一 半的数字
题目编写函数: 求数组中元素出现次数超过数组长度一半的数字。如: {1,2,3,2,2,2,5,4,2} 数字 2 为超过数组长度一半的数字代码#include<stdio.h>void fun(int* arr,int sz){ int i; int flag = 0; int num; for (i = 0; i < sz; i++) { int count = 0; int k; num = arr[i]; for (k = 0; k <原创 2021-08-19 13:00:49 · 159 阅读 · 0 评论