c语言字符串算法题,【算法字符串面试题】面试问题:c语言-一些学… - 看准网...

1.计算十进制数n<=255的二进制1的个数

//计算十进制数n<=255的二进制1的个数

int show1count(unsigned int n){

int m = n==0 ? 0 : 1;

while ((n=(n&(n-1)))) {

m++;

}

return m;

}

int main(int argc, const char * argv[]) {

int number;

printf("请输入一个整数且不大于255:\n");

scanf("%d",&number);

printf("十进制数%d转化为二进制数后1的个数:%d\n",number,show1count(number));

return 0;

}测试结果截图:

a8b99cb1dff8f432e8dcbf3957f1b566.png

2.计算数组最大值所在元素下标

//计算数组最大值所在元素下标

void showMaxIndex(int a[],int n,int *temp){

int i;

for (i=0,*temp=i; i

if (a[i]>*temp) {

*temp = i;

}

}

}

int main(int argc, const char * argv[]) {

int temp;

int a[5] = {1,6,2,8,0};

showMaxIndex(a,5,&temp);

printf("%d\n",temp);

return 0;

}测试结果截图:

94c794150190d81863c7d3622f82d7f1.png

3.找出100~x(x≤999)之间各位上的数字之和为15的所有整数

//找出100~x(x≤999)之间各位上的数字之和为15的所有整数

int bitPlusIs15(int x){

int s1,s2,s3,t,n;

t = 100;

while (t

s1 = t%10;

s2 = (t/10)%10;

s3 = t/100;

if (s1+s2+s3==15) {

printf("%d ", t);

n++;

}

t++;

}

return n;

}

int main(int argc, const char * argv[]) {

printf("\n满足要求个数:%d\n",bitPlusIs15(200));

return 0;

}测试结果截图:

d459d5e7742686110c5e2af17756e770.png

4.统计一行中有多少个单词,单词之间用空格分开

//统计一行中有多少个单词,单词之间用空格分开

void countWordNum(){

char string[80];

int i,num=0,word=0;

char c;

gets(string);

for (i = 0; (c=string[i])!='\0';i++ ) {

if (c==' ') {

word = 0;

}else if (word==0){

word = 1;

num++;

}

}

printf("There are %d words in the line.\n",num);

}

int main(int argc, const char * argv[]) {

countWordNum();

return 0;

}测试结果截图:

e4c1bb2225363c7284f0ee0bea78d8fd.png

5.字符串统计并排序

//字符串统计并排序

void statisticsAndSortStr(char *str)

{

char hist[256];

int i;

for(i=0;i<256;i++)

hist[i] = 0; //要是不给数字赋初值呢?

while(*str != '\0'){

hist[*str++]++; //很巧妙

}

for(i=0;i<256;i++){//只打印出现过的字符个数

if(hist[i]){//或者if(hist[i] != 0) 但是用while(hist[i])就会出现死循环

printf("%c :%d \n",i,hist[i]);

}

}

}

int main(int argc, const char * argv[]) {

char str[80];

printf("Enter a string:");

gets(str);

statisticsAndSortStr(str);

return 0;

}

b2d925da8b83e72767ff27d5427d9832.png

6.奇数在前,偶数在后,其它的相对位置不变

#include

using namespace std;

//两个思路吧,第一个思路:类似冒泡算法,前偶后奇数就交换:

void reOrderArray(vector &array) { //&限定必须是可修改的左值,因此实参必须是可修改的。例:地址不行,它是常量

for (int i = 0; i < array.size();i++)

{

for (int j = array.size() - 1; j>i;j--)

{

if (array[j] % 2 == 1 && array[j - 1]%2 == 0) //前偶后奇交换

{

swap(array[j], array[j-1]);

}

}

}

}

//第二个思路:再创建一个数组

void reOrderArray2(vector &array) {

vector array_temp;

vector::iterator ib1, ie1;

ib1 = array.begin();

for (; ib1 != array.end();){ //遇见偶数,就保存到新数组,同时从原数组中删除

if (*ib1 % 2 == 0) {

array_temp.push_back(*ib1);

ib1 = array.erase(ib1);

}

else{

ib1++;

}

}

vector::iterator ib2, ie2;

ib2 = array_temp.begin();

ie2 = array_temp.end();

for (; ib2 != ie2; ib2++) { //将新数组的数添加到老数组

array.push_back(*ib2);

}

}

int main(int argc, const char * argv[]) {

vector vec;

vec.push_back(1);

vec.push_back(3);

vec.push_back(5);

vec.push_back(2);

vec.push_back(4);

vec.push_back(6);

vec.push_back(7);

vec.push_back(8);

vec.push_back(9);

vec.push_back(10);

vec.push_back(11);

vec.push_back(12);

reOrderArray(vec);

vector::iterator it;

for (it=vec.begin(); it!=vec.end();it++) {

printf("%d\n",*it);

}

return 0;

}测试结果截图:

6fa91a2969d9afdbaa8c6da741fc810b.png

7.通信录中记录每位学生的编号、姓名和电话号码。班级人数和学生信息从键盘读入,每个人的信息作为一个数据块写到名为myfile5.dat的二进制文件中

#define N 5

//通信录中记录每位学生的编号、姓名和电话号码。班级人数和学生信息从键盘读入,每个人的信息作为一个数据块写到名为myfile5.dat的二进制文件中

typedef struct{

int num;

char name[10];

char tel[10];

} STYPE;

//写文件

int writeFile(STYPE * std){

FILE * fp;

int i;

if ((fp=fopen("myfile5.dat", "wb")) == NULL )

return (0);

printf("\noutput data to file!\n");

for ( i = 0 ; i < N; i ++ )

fwrite(&std[i], sizeof (STYPE), 1, fp );

fclose (fp);

return 1 ;

}

//读文件

void readFile(){

FILE *fp ;

int i;

STYPE s[10];//结构体数组

if ((fp = fopen("myfile5.dat", "rb")) == NULL){//读取文件失败

printf("Fail!\n");

exit(0);

}

printf ("\nnum name tel\n");

for ( i = 0; i < N; i ++ ){

fread (&s[i], sizeof ( STYPE ), 1, fp);

printf ("%6d %s %s \n", s[i].num, s[i].name, s[i].tel);

}

fclose (fp);

}

int main(int argc, const char * argv[]) {

STYPE s[10] =

{{1, "aaaaa", "111111"},

{1,"bbbbb","222222"},

{1,"ccccc","333333"},

{1,"ddddd","444444"},

{1,"eeeee","555555"}};

int k = writeFile(s);

if (k == 1){

printf("writeFile Succeed !");

readFile() ;

}else {

printf("writeFile Fail !");

}

return 0;

}测试结果截图:

9eda289fcce892cfdebb65aff9234973.png

8.删除多余的空格

void removeMoreSpace(){

char p[15] = "z t f";

char *p0 = p;

char *p1 = p0;

int flag = 0;

while(*p1!='\0'){

if(*p1==' '&& flag==0){ //第一个空格

flag = 1;

*p0++ = *p1;

}else if(*p1!=' '){ //非空格字符

flag = 0;

*p0++ = *p1;

}

p1++;

}

*p0='\0';

printf("%s",p);

}

//不使用标识符

void removeMoreSpace2(){

char p[15] = "z t f";

char *p0 = p;

char *p1 = p0;

while(*p1!='\0'){

if(!(*p1==' '&& *(p1+1)==' ')){

*p0++ = *p1;

}

p1++;

}

*p0='\0';

printf("%s",p);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值