1.寻找最长的行
问题描述
寻找若干行文本中最长的一行
输入说明
输入为多个字符串(每个字符串长度不超过100个字符),每个字符串占一行,输入的行为“end”时表示输入结束
输出说明
输出其中最长的一行长度后换行再输出最长行的内容,如果最长行不止一个,则输出其中的第一行。
输入样例
abce
abdf dlfd
end
输出样例
9
abdf dlfd
//没有oj判断对错,上面是我的答案,下面有别人的答案
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a,b;
int max = 0;
//getline 的 C++ 函数。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
//getline(cin, inputLine);
while (getline(cin, a))
{
if (a == "end")
break;
int len = a.length();
if (len > max)
{
max = len;
b = a;
}
}
cout << max << endl;
cout << b << endl;
return 0;
}
//别人答案,学习一下
#include<iostream>
#include<string>
using namespace std;
int main()
{
char s[100], end[100];
int len, max;
gets_s(s, 100);
//C ++ strcpy()
//C ++中的strcpy()函数将字符串从源复制到目标。
//char* strcpy(char* dest,const char* src);
strcpy(end, s);
max = strlen(s);
while (strcmp(s, "end"))
{
gets_s(s, 100);
len = strlen(s);
if (len > max)
{
max = len;
strcpy(end, s);
}
}
cout << max << endl;
puts(end);
}
2.字符串压缩
问题描述
有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。
请设计一个程序,将采用该压缩方法得到的字符串解压缩,还原出原字符串并输出。
输入说明
输入数据为一个字符串(长度不大于50,只包含字母和数字),表示压缩后的字符串
输出说明
在一行上输出解压缩后的英文字符串(长度不超过100),最后换行。
输入样例
a5b3aba13b4
输出样例
aaaaabbbabaaaaaaaaaaaaabbbb
//没有oj判断对错,上面是我的答案,下面有别人的答案
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char arr[51];
gets_s(arr, 50);
int len = strlen(arr);
for (int i = 0; i < len; i++)
{
if (arr[i] >= 'a' && arr[i] <= 'z')
cout << arr[i];
if (arr[i] >= '0' && arr[i] <= '9')
{
char b = arr[i - 1];
int num = arr[i] - '0';
while (arr[i + 1] >= '0' && arr[i + 1] <= '9')
{
i++;
num = num * 10 + (arr[i] - '0');
}
for (int j = 0; j < num - 1; j++)
cout << b;
}
}
return 0;
}
#include<iostream>
#include<string.h>
#include<ctype.h> //isalpha、isalnum、isdigit、islower、isupper
using namespace std;
int main()
{
char a[50], ch;
int i, j, num;
num = 0;
gets_s(a, 50);
for (i = 0; i < strlen(a); i++)
{
//isalpha()用来判断一个字符是否为字母
if (isalpha(a[i]))
{
ch = a[i];
putchar(ch);
num = 0;
}
else
{
//a[i]-'0'将数字从字符转为整形
num = num * 10 + (a[i] - '0');
//isdigit() 用来检测一个字符是否是十进制数字0-9
if (isdigit(a[i + 1]))
continue;
else
{
for (j = 0; j < num - 1; j++)
putchar(ch);
}
}
}
}
3.0-1矩阵
问题描述
查找一个只包含0和1的矩阵中每行最长的连续1序列。
输入说明
输入第一行为两个整数m和n(0<=m,n<=100)表示二维数组行数和列数,其后为m行数据,每行n个整数(0或1),输入数据中不会出现同一行有两个最长1序列的情况。
输出说明
找出每一行最长的连续1序列,输出其起始位置(从0开始计算)和结束位置(从0开始计算),如果这一行没有1则输出两个-1,然后换行。
输入样例
5 6
1 0 0 1 1 0
0 0 0 0 0 0
1 1 1 1 1 1
1 1 1 0 1 1
0 0 1 1 0 0
输出样例
3 4
-1 -1
0 5
0 2
2 3
#include<iostream>
using namespace std;
int main()
{
int m, n;
cin >> m >> n;
int arr[100][100];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arr[i][j];
}
}
for (int i = 0; i < m; i++)
{
int begin, end, max = 0, num = 0;
for (int j = 0; j < n; j++)
{
//遍历到一行最后一列的前一个数时
if (j != n - 1)
{
if (arr[i][j] == 1)
{
num++; //记录一共有几个连续1
}
else
{
//如果出现0则num计数于max比较,如果num>max,记录连续1的begin和end,num置零继续寻找连续1
if (num > max)
{
max = num;
num = 0;
begin = j - max;
end = j - 1;
}
}
}
//如果遍历到一行最后一列
else
{
//如果最后一列为1
if (arr[i][j] == 1)
{
num++;
if (num > max)
{
max = num;
begin = j - max + 1;
end = j;
}
}
//如果最后一列不为1
else
{
if (num > max)
{
max = num;
begin = j - max;
end = j - 1;
}
}
}
}
if (max == 0)
{
begin = -1;
end = -1;
}
cout << begin << " " << end << endl;
}
return 0;
}
4.等差数列
问题描述
请写一个程序,判断给定整数序列能否构成一个等差数列。
输入说明
输入数据由两行构成,第一行只有一个整数n(n<100),表示序列长度(该序列中整数的个数);
第二行为n个整数,每个整数的取值区间都为[-32768~32767],整数之间以空格间隔。
输出说明
对输入数据进行判断,不能构成等差数列输出“no”,能构成等差数列输出表示数列公差(相邻两项的差)的绝对值的一个整数。
输入样例
样例1输入
6
23 15 4 18 35 11
样例2输入
5
2 6 8 4 10
输出样例
样例1输出
no
样例2输出
2
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, arr[101];
while (cin >> n)
{
bool flag = true;
for (int i = 0; i < n; i++)
cin >> arr[i];
sort(arr, arr + n);
int minus = arr[1] - arr[0];
for (int i = 2; i < n; i++)
{
if (arr[i] - arr[i - 1] != minus)
{
flag = false;
}
}
if (flag==true)
cout << minus << endl;
else
cout << "no" << endl;
}
return 0;
}
//排序函数自己写
#include<iostream>
using namespace std;
int main()
{
int n, num[100], i, delta, flag = 1;
void sort(int* n, int l);
cin >> n;
for (i = 0; i < n; i++)
cin >> num[i];
sort(num, n);
delta = num[1] - num[0];
for (i = 2; i < n; i++)
{
if (delta != num[i] - num[i - 1])
flag = 0;
}
if (flag)
printf("%d", delta);
else
printf("no");
}
//排序
void sort(int* n, int l)
{
int i, j, t;
for (i = 1; i < l; i++)
{
for (j = 0; j < l - i; j++)
{
if (n[j] > n[j + 1])
{
t = n[j];
n[j] = n[j + 1];
n[j + 1] = t;
}
}
}
}
5.马鞍点
问题描述
若一个矩阵中的某元素在其所在行最小而在其所在列最大,则该元素为矩阵的一个马鞍点。
请写一个程序,找出给定矩阵的马鞍点。
输入说明
输入数据第一行只有两个整数m和n(0<m<100,0<n<100),分别表示矩阵的行数和列数;
接下来的m行、每行n个整数表示矩阵元素(矩阵中的元素互不相同),整数之间以空格间隔。
输出说明
在一行上输出马鞍点的行号、列号(行号和列号从0开始计数)及元素的值(用一个空格分隔),之后换行;
若不存在马鞍点,则输出一个字符串“no”后换行。
输入样例
4 3
11 13 121
407 72 88
23 58 1
134 30 62
输出样例
1 1 72
输入样例
2 2
1 1
1 1
输出样例
no
//此题复习绕不明白了
#include<iostream>
using namespace std;
int main()
{
//end用于确定马鞍点,t暂存最大最小值,index为最大最小值对应的横/纵坐标
int n, m, i, j, num[100][100], end[100][100] = { 0 }, t, index, flag = 0;
cin >> n >> m;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
cin >> num[i][j];
}
//比较每列的数
for (i = 0; i < n; i++)
{
t = num[i][0];
index = 0;
//flag用于确认有无最小值eg:(1,1,1,1)
flag = 0;
for (j = 0; j < m; j++)
{
if (num[i][j] < t)
{
t = num[i][j];
index = j;
flag = 1;
}
}
//将num中最小值所在位置对应于end的数加一
if (flag)
end[i][index]++;
}
//比较每行的数
for (j = 0; j < m; j++)
{
t = num[0][j];
index = 0;
flag = 0;
for (i = 0; i < n; i++)
{
if (num[i][j] > t)
{
t = num[i][j];
index = i;
flag = 1;
}
}
//将num中最大值所在位置对应于end的数加一,也就是说end中为2的位置就是num的马鞍点
if (flag)
end[index][j]++;
}
//这里flag用于判断有无马鞍点
flag = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (end[i][j] == 2)
{
flag = 1;
cout << i << ' ' << j << ' ' << num[i][j];
}
}
}
if (flag == 0)
cout << "no";
return 0;
}