一、基础编程题:
1.实现插入排序或选择排序算法
插入排序:
#include<iostream>
#include<cstdlib>
using namespace std;
//交换数组元素位置位置
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void print(int arr[], int n){//打印数组
for(int j= 0; j<n; j++){
cout<<arr[j] <<" ";
}
cout<<endl;
}
/*
插入排序。
注意,若后面一个元素比其前面一个元素小,
则将这两个元素交换位置,然后再来比较这个插入元素与前面一个元素的大小,
若小,则还需要交换这两个元素位置,一直到这个插入元素在正确的位置为止
*/
void insertSort(int a[], int length)
{
for (int i = 1; i < length; i++)
{
for (int j = i - 1; j >= 0 && a[j + 1] < a[j]; j--)
{
swap(a[j], a[j + 1]);
}
}
}
int main()
{
int n;
cout<<"数字总个数n:"<<endl;
cin>>n;
int A[n];
cout<<"要排序数字:"<<endl;
for(int i=0;i<n;i++){
cin>>A[i];
}
cout<<"原始序列:"<<endl;
print(A,n);
insertSort(A, n);
cout<<"排序后结果:"<<endl;
print(A,n);
system("pause");
return 0;
}
选择排序:
#include<iostream>
using namespace std;
void print(int a[], int n)//打印数组
{
for(int j= 0; j<n; j++)
{
cout<<a[j] <<" ";
}
cout<<endl;
}
/*
第一次从待排序的数据元素中选出最小(或最大)的一个元素,
存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,
然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零
*/
void selectSort(int a[], int len)//选择排序
{
int minindex, temp;
for(int i = 0; i<len-1;i++)
{
minindex = i;//记录最小
for(int j = i+1; j<len; j++)
{
if(a[j]<a[minindex])
minindex = j;//遍历 i+1~len 的值,找到其中最小值的位置
}
// 交换当前索引 i 和最小值索引 minIndex 两处的值
temp = a[i];
a[i] = a[minindex];
a[minindex] = temp;
// 执行完一次循环,当前索引 i 处的值为最小值,直到循环结束即可完成排序
}
}
int main(){
int a[10] = {8,1,9,7,2,4,5,6,10,3};
cout<<"初始序列:";
print(a,10);
selectSort(a,10);
cout<<"排序结果:";
print(a,10);
}
2.键盘输入一组正整数,检查是否存在任意的三个数满足因数关系,即a*b=c;
#include <stdio.h>
#include <string.h>
int n;
bool Func_1(int arr[]);
bool Func_2(int num, int arr[]);
int main(void)
{
scanf("%d", &n);
int arr[n];
for(int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
Func_1(arr);
return 0;
}
bool Func_1(int arr[])
{
int ans;
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
ans = arr[i] * arr[j];
if(Func_2(ans, arr))
{
printf("%d * %d = %d\n", arr[i], arr[j], ans);
}
}
}
}
bool Func_2(int num, int arr[])
{
for(int i = 0; i < n; i++)
{
if(arr[i] == num)
{
return true;
}
}
return false;
}
3.从键盘输入一个长字符串,找出并输出其中所有的三个连续字符串,例如abc或efg等;
#include <iostream>
#include <string.h>
using namespace std;
bool Judge(char str[], int i)
{
if(str[i] + 1 == str[i + 1] && str[i + 1] + 1 == str[i + 2])
{
return true;
}
else
{
return false;
}
}
int main(void)
{
char str[10001];
cin.get(str,1000);
int len = strlen(str);
for(int i = 0; i <= len - 3; i++)
{
if(Judge(str, i))
{
cout<<str[i]<<str[i + 1]<<str[i + 2]<<endl;
}
else{
cout<<"No"<<endl;
}
}
return 0;
}
4.统计文本的段落数量,总单词数量,以及文本的最长最短平均单词数量:
5.判断某数字是否是回文数字:
#include<iostream>
using namespace std;
int main(){
char c[1001];
//此处为C++输入字符串的处理
while(cin.get(c,1000)){
int i=0;
int flag=0;
//此处为字符串字符个数的计算,通过计算\0位置
for(i=0;c[i]!=0;i++);
for(int j=0;j<i;j++){
if(c[j]!=c[i-1-j]){//首尾判断是否相等
flag=1;
cout<<"No!"<<endl;
break;
}
}
if(!flag)
cout<<"Yes!"<<endl;
}
}
6.输入一个字符串,把所有的大写子母变成小写,小写变成大写并输出:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a;
getline(cin, a);//输入字符串
for (int i = 0; i < a.size(); i++)
{
if (a[i] >= 'a'&&a[i <= 'z'])//小写变大写
{
a[i] = a[i] - 32;
}
else if (a[i] >= 'A'&&a[i <= 'Z'])//大写变小写
{
a[i] = a[i] + 32;
}
}
cout << a;
}
二、高级编程题:
7.在有向图中,任意指定两个节点分别为起点和终点,编程查找输出两个节点之间的最小距离;
8.编程查找某个字符组成的二叉树中,是否存在两个相同的节点
例如:存在两个节点值都是“c”
9.某个图像通过一个整数组成的n*n矩阵表示,其中每个整数表示一个像素值。写出一种方法, 根据flag变量的值将图像向右或者向左旋转90°。如果flag值为0,则向左旋转,如果flag为1,则向右旋转。函数rotatePictureMethod的输入分别由矩阵matrix、矩阵的维度n以及flag的值组成。函数应返回一个指向二维矩阵指针,该矩阵是按照flag值旋转后的结果矩阵而动态分配的。
示例:
如果标志flag=1且m=3,n=3,
输入矩阵
1 2 3
4 5 6
7 8 9
输出矩阵
7 4 1
8 5 2
9 6 3
#include<stdio.h>
#include<stdlib.h>
void BuildArray(int n,int ***p)
{
int i;
*p=(int **)malloc(n*sizeof(int));
for(i=0;i<n;++i)
{
(*p)[i]=(int *)malloc(n*sizeof(int));
}//for
}//BuildArray,为矩阵分配空间
int **rotatePictureMethod(int **matrix,int n,int flag)
{
int **rotatedMatrix;
int i,j;//临时变量
BuildArray(n,&rotatedMatrix);//为rotatedMatrix矩阵分配空间
if(flag==0)
{
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
rotatedMatrix[i][j]=matrix[j][n-i-1];
}//for
}//for
}//if,左旋
else if(flag==1)
{
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
rotatedMatrix[i][j]=matrix[n-j-1][i];
}//for
}//for
}//if,右旋
return rotatedMatrix;
}//rotatePictureMethod,旋转
int main()
{
int n=0;//矩阵阶数
int **matrix,**rotatedMatrix;//rotatedMatrix用来接收返回的数组指针
int i,j;//临时变量
int flag;//旋转控制
printf("输入阶数n:");
scanf("%d",&n); //输入阶数
BuildArray(n,&matrix);//为matrix矩阵分配空间
printf("输入矩阵matrix:\n");
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
scanf("%d",&matrix[i][j]);
}//for
}//for,为matrix矩阵赋值
printf("输入旋转控制量flag:");
scanf("%d",&flag);//输入旋转控制量
rotatedMatrix=rotatePictureMethod(matrix,n,flag);
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
printf("%d\t",rotatedMatrix[i][j]);
}//for
printf("\n");
}//for,输出旋转后矩阵
system("pause");//暂停
return 0;
}//main