面試題
// 經典1面試
//隨機產生20個[10,50]的正整數存到數組中,並求出數組中的全部元素最大值,最小值,平均值以及個元素之和,及第二大值
int a[20] = {0};
printf("隨機產生的元素:\n");
for (int i = 0; i < 20; i++) {
a[i] = arc4random() % (50 - 10 +1) + 10;
printf("%d ",a[i]);
}
printf("\n");
//求全部元素的最大值
int max = 0;
for (int i = 0; i < 20; i++) {
if (a[i] > max) {
max = a[i];
}
}
printf("max = %d\n", max);
//求全部元素的最小值
int min = a[0];
for (int i = 1; i < 20; i++) {
if (min > a[i]) {
min = a[i];
}
}
printf("min = %d\n", min);
//求全部元素的和
int sum = 0;
for (int i = 0; i < 20; i++) {
sum += a[i];
}
printf("sum = %d\n", sum);
//求全部元素的平均值
float mid = 0;
mid = sum / 20;
printf("mid = %.2f\n", mid);
//求第二大值
int smax = 0;
for (int i = 0; i < 20; i++) {
if (smax < a[i] && a[i] < max) {
smax = a[i];
}
}
printf("smax = %d", smax);
// 經典2
//編程在一個已知的字符串中查找最長單詞,假定字符串只含字母和空格,用空格來分隔單詞
//思路:
//主要是判斷單詞,連續的字母,就假定爲一個單詞,從讀取到第一個字母開始計數,而後直接遇到空格,爲一個單詞的長度,用一個變量記錄,最長單詞的長度,若是要輸出最長的單詞,通常是放在數組裏面,記住下標.
char targetString[] = "I come china";
int maxLength = 0;//最長長度
int currentLength = 0;//當前獲得的單詞的長度
int maxIndex = 0;//當前最長單詞的起始下標
int tempArray[200] = {0};
for (int i = 0; i <= strlen(targetString); i++) {
if (targetString[i] != ' ' && targetString[i] != '\0') {
currentLength++;
} else {
if (maxLength <= currentLength) {
maxLength = currentLength;
maxIndex = i - currentLength; //記錄當前最長單詞的起始下標
tempArray[maxIndex] = maxLength;
}
currentLength = 0;//同時給記錄單詞長度的currentlength作清零操做
}
}
for (int i = 0 ; i < 200; i++) {
if (tempArray[i] == maxLength) {
for (int j = i; j < i + maxLength; j++) {
printf("%c", targetString[j]);
}
printf("\n");
}
}
// 經典3
//耶穌有13個門徒,其中有一個就是出賣耶穌的叛徒,請用排除法找出這位叛徒:13人圍坐一圈,從第一個開始報號:1,2,3,1,2,3...凡是報到'3'就退出圈子,最後留在圈子內的人就是出賣耶穌的叛徒.請找出它原來的序號
int array[13]={1,2,3,4,5,6,7,8,9,10,11,12,13};//模擬報數,0表示未退出圈子,1表示退出圈子
int numbers=13;//表示剩餘人數
int count = 0;//表示報數
int i =0;// 表示下標的循環變量
while (numbers > 1) {
if (array[i]!=0) {//若是當前獲得的數組元素不爲0,表示沒有退出圈子,則count++表示報數
count++;
}
if (count == 3) {
printf("%d號退出圈子\n",array[i]);
array[i] = 0;//表示當前報數的人報的數爲3,則經過數組元素賦值爲0來表示他退出圈子
count = 0;//報數歸0
numbers --;//表示退出圈子後剩餘的人數
}
i++;
i = i %13;// 若是i爲13時,讓i從新從0開始
}
for ( int i =0; i < 13; i++) {
if (array[i] > 0) {
printf("%d號是叛徒",array[i]);
}
}
// 經典4
//將兩個排好序的數組,合併到另外一個數組中,而且合併以後的數組也是有序的
int i = 0, m = 5, a[5] = {1, 3, 7, 9, 13};
int j = 0, n = 6, b[6] = {2, 4, 8, 16, 20, 24};
int k = 0, c[11];
while(i + j < m + n)
{
if(j >= n) {
c[k++] = a[i++];
}
else if(i >= m) {
c[k++] = b[j++];
}
else if(a[i] < b[j]){
c[k++] = a[i++];
}
else {
c[k++] = b[j++];
}
}
for(i = 0;i < k;i++){
printf("%d ",c[i]);
}
// 經典5
//有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
float sum = 0;
float x = 2, y = 1, temp = 0;
for (int i = 0; i < 20; i++) {
sum = sum + x / y;
temp = x;
x = x + y;
y = temp;
}
printf("%.3f", sum);
//給一個很少於5位的正整數,要求:1、求它是幾位數,2、逆序打印出各位數字。
//方法一:
long a=0,b=0;
int t=0;
printf("請輸入很少於5位的正整數:\n");
scanf("%ld",&a);
if (a >= 100000) {
printf("請輸入很少於5位的正整數\n");
}else {
for(t=0;a>0;a/=10,t++)
{
b=(b*10)+a%10;
}
printf("這個數是%d位的,逆序數=%ld\n",t,b);
}
//方法二:
int a = 0, b = 0, c = 0, d = 0, e = 0, x = 0;
printf("請輸入很少於5位的整數:\n");
scanf("%d", &x);
if (x > 100000) {
printf("請輸入很少於5位的整數");
}else{
a = x / 10000;//分解出萬位
b = x % 10000 / 1000;//分解出千位
c = x % 1000 / 100;//分解出百位
d = x % 100 / 10;//分解出十位
e = x % 10;//分解出個位
if (a !=0 ) {
printf("這個數是5位的, 逆序數 = %d%d%d%d%d\n",e, d, c, b, a);
}else if (b!=0){
printf("這個數是4位的, 逆序數 = %d%d%d%d\n",e,d,c,b);
}else if (c!=0){
printf("這個數是3位的, 逆序數 = %d%d%d\n",e,d,c);
}else if (d!=0){
printf("這個數是2位的, 逆序數 = %d%d\n",e,d);
}else if (e!=0){
printf("這個數是1位的, 逆序數 = %d\n",e);
}
}
// 方法三
int num = 0, temp = 0, i = 0;
printf("請輸入一個數字\n");
scanf("%d", &num);
while(num > 0)
{
temp = num % 10;
++i;
printf("%d", temp);
num = num / 10;
}
printf("\n這個數是%d位數", i);
// 經典6
//一個5位數,判斷它是否是迴文數.即12321是迴文數,個位與萬位相同,十位與千位相同.
long w = 0, q = 0, s = 0, g = 0 , x = 0;
printf("請輸入一個5位數:\n");
scanf("%ld", &x);
if (x > 100000 || x < 10000) {
printf("請輸入一個5位數:\n");
}else{
w = x / 10000;//求萬位的數字
q = (x % 10000) / 1000; //求千位的數字
s = x % 100 / 10;//求十位的數字
g = x % 10;//求個位數字
if (g == w && q == s) {
printf("是迴文數");
}
else{
printf("不是迴文數");
}
}
//經典7
//星期一 Monday
//星期二 Tuesday
//星期三 Wednesday
//星期四 Thursday
//星期五 Friday
//星期六 Saturday
//星期日 sunday
//請輸入星期幾的第一個字母來判斷一下是星期幾,若是第一個字母同樣,則繼續判斷第二個字母
char week1;
char week2;
printf("星期一 Monday \n星期二 Tuesday \n星期三
Wednesday \n星期四 Thursday \n星期五 Friday \n星期六 Saturday \n星期日
sunday\nplease enter a letter\n");
scanf("%c",&week1);
switch(week1)
{
case('M' | 'm'):printf("the answer is Monday\n");
break;
case'W':printf("the answer is Wednesday\n");
break;
case('F' | 'f'):printf("the answer is Friday\n");
break;
case('S' | 's'):
{
printf("please enter the second letter\n");
scanf("%c",&week2);
getchar();
if(week2 == ('a' | 'A'))
printf("the answer is Saturday\n");
else
if(week2 == ('u' | 'U'))
printf("the answer is Sunday\n");
else
printf("there is no answer\n");
}
break;
case('T' | 't'):
{
printf("please enter the second letter\n");
scanf("%c",&week2);
getchar();
if(week2 == ('U' | 'u')) printf("the answer is Tuesday\n");
else if(week2 == ('H' | 'h'))
printf("the answer is Thursday\n");
else
printf("there is no answer\n");
}
break;
default:
printf("there is no correct answer\n");
break;
}
// 經典8
//有1000000個數,每一個數取值範圍是0-999999找出其中重複的數,重複次數
int a[1000000] = {0}, b[1000000] = {0}, count = 0;
for(int i = 0 ; i < 1000000 ; i ++){
a[i] = arc4random()%1000000;
b[a[i]]++;
}
for (int j = 0 ; j < 1000000; j++) {
if(b[j] > 1){
count++;
printf("重複數是%d \n",j);
}
}
編程