C++面试题之字符串编程

题目描述: 计算字符串最后一个单词的长度,单词以空格隔开。
输入描述: 一行字符串,非空,长度小于5000。
输出描述: 整数N,最后一个单词的长度。

示例1: 输入: hello world 输出: 5

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char  s[5000];
    int count = 0;
    int index = 0;
    while(scanf("%c", &s[index]) != EOF){
        if(s[index] ==' '){
            count = 0;
        }
        else{
            count++;
        }
        index++;
    }
    printf("%d\n", count - 1);
    return 0;
}

题目描述:将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。
输入参数:
inputString:输入的字符串
返回值:
输出转换好的逆序字符串

如:输入“I am a student”,输出“tneduts a ma I”。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    getline(cin,str);
    for(int i = str.size()-1;i>=0;i--)
        cout << str[i];
}

题目描述:找出给定字符串中大写字符(即’A’-‘Z’)的个数
接口说明
原型:int CalcCapital(String str);
返回值:int

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str;
    while(cin>>str)
    {
        int ans=0;
        for(int i=0;i<str.size();i++)
        {
            if(str[i]>='A'&&str[i]<='Z')
                ans++;
        }
        cout<<ans<<endl;
    }

    return 0;
}

题目描述:写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串
输入描述:
输入N个字符
输出描述:
输出该字符串反转后的字符串

#include <stdio.h>
#include <string.h>

// 直接反向输出

int main()
{
    char s[1001]="";
    while(scanf("%s",s)!=EOF){
        int len,i;
        len = strlen(s);
        for(i=len-1; i>=0; i--){
            printf("%c",s[i]);
        }
        printf("\n");
    }
    return 0;
}

题目描述:输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

#include <stdio.h>
#include <string.h>
    
int main(void)
{
    int n,m=0;
    scanf("%d",&n);
    int a[10]={0};
    while(n)
    {
        if(a[n%10] == 0)
        {
            a[n%10]++;
            m = m*10 + n%10;
        }
        n /= 10;
    }
    printf("%d\n",m);
    return 0;
}

题目描述:一个长度为N的整形数组,数组中每个元素的取值范围是[0, N-1],判断该数组中是否有重复的数;
思路:把每个数放到自己所对应序号的位置上,如果其他位置上有和自己对应序号相同的数,说明有重复的数。

bool IsRepeatNumber(int *arr, int n)
{
    if(arr == NULL) return false;
    for(int i=0;i<n;i++)
    {
        while(arr[i] !=i)
        {
            if(arr[arr[i]] == arr[i])
                return true;
            int temp = arr[arr[i]];
            arr[arr[i]] = arr[i];
            arr[i] = temp;
        }
    }
    return false;
}

题目:将两个字符串合并成新的字符串

char* strcat(char* desStr, const char* srcStr)
{
	assert(desStr!=NULL&&srcStr!=NULL);
	char* address= srcStr;
	while(*desStr!='\0')
	{
		desStr++;
	}
	while(*desStr++ = *srcStr++);
	return address;
}

int main()
{
	char arr1[10]="hello ";
    char arr2[]="word";
    strcat(arr1,arr2);
    printf("%s",arr1);
    system("pause");
	return 0;
}

题目描述:从键盘输入两个有序字符串(其中字符按ASCII码从小到大排序,并且不含重复字符),将两字符串合并,要求合并后的字符串仍是有序的,并且重复字符只出现一次,最后输出合并后的结果

#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>

using namespace std;

int main()
{
    int i;
    string s1;
    string s2;

    cin >> s1;
    cin >> s2;

	// 字符串连接
    s1 += s2;
	// 储存连接后的字符串长度
    const int length = s1.size();

	// 对字符串排序
    sort(s1.begin(), s1.end());

	// 这两行代码可以用下面注释掉的代码代替,但不推荐
	// 将C++风格的字符串s1,转换为C风格的字符串,并存入数组t
    char t[length];
    strcpy(t, s1.c_str());
	// 去重,拿到第一个重复数据的下标
    int n = unique(t, t + length) - t;

	// 将前面不重复的数据输出
    for (i = 0; i < n; i++)
        cout << t[i];

    return 0;
}

题目描述:字符串strlen实现

int strlen(const char *str)
{
	assert(str);
    const char *end = str;    
    while(*end++);
    return (end-str-1);
}
int main()
{
    char str[]="abcdef";
    printf("str长度是:%d\n",strlen(str));
    system("pause");
    return 0;
}

题目描述:在字符串中找出连续最长的数字串,并输出最长串
输入描述:
字符串输出描述:
连续数字串&在所有数字串最长的长度

示例1
输入
abcd12345ed125ss123058789
输出
123058789

#include <iostream>
#include <string>
using namespace std;

int main() {
  string s;
  while (cin >> s) {
    int len = 0;
    int maxLen = 0;
    int pos = -1;
    for (int i = 0; i < s.size(); i++) 
    {
      if (s[i] >= '0' && s[i] <= '9') 
      {
        len++;
        if (maxLen <= len) 
        {
          maxLen = len;
          pos = i;
        }
      }
       else 
      {
        len = 0;
      }
    }
    if(maxLen)
        cout << s.substr(pos - maxLen + 1, maxLen) << endl;
    cout << maxLen << endl;
  }
  return 0;
}

修改后:
int getLongNumber(string s)
{
    int len = 0;
    int maxLen = 0;
    int pos = -1;
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            len++;
            if (maxLen <= len)
            {
                maxLen = len;
                pos = i;
            }
        }
        else
        {
            len = 0;
        }
    }
    if(maxLen)
        cout << s.substr(pos - maxLen + 1, maxLen) << endl;
    cout << maxLen << endl;

    return maxLen;
}

题目描述:写出一个程序,接受一个十六进制的数,输出该数值的十进制表示
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。

//方法一:
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	char str[100];
	int i=0,count,sum;
	while(gets(str))//用于多次输入
	{
		count=strlen(str);//计算字符串的长度
		sum=0;
	    for(i=count-1;i>=0;i--)//从十六进制个位开始,每位都转换成十进制
	    {
			if(str[i]>='0'&&str[i]<='9')//数字字符的转换
			{
				sum+=(str[i]-48)*pow(16,count-i-1);
			}
			else if(str[i]>='A'&&str[i]<='F')//字母字符的转换
			{
				sum+=(str[i]-55)*pow(16,count-i-1);
			}
	    }
	    printf("%d\n",sum);
	}
	return 0;
 } 

//方法二:
int hex2dec(string s)
{
    int sum=0, num;
    for(i=2;i<=s.length()-1;i++)
    {
         if((s[i]>='a'&&s[i]<='f') || (s[i]>='A'&&s[i]<='F'))
         {
             num=s[i]-'a'+10;
         }
         else
         {
             num=s[i]-'1'+1;
         }
         int n=s.length()-1-i;
         int flag=1;
         while(n--)
         {
             flag=flag*16;
         }
         sum=sum+flag*num;
    }
    return sum;
}

题目描述:输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数

#include <stdio.h>

int function(int input);
int main(){
    int input, result;
    scanf("%d",&input);
    result = function(input);
    printf("%d", result);
    return 0;
}

int function(int input){
    int count = 0;
    while(input){
        if(input&1 == 1){
            count++;
        }
        input = input >> 1;
    }
    return count;
}

题目描述:编写一个算法编写一个算法,将十进制变为二进制后取反,再十进制输出

#include<iostream>
using namespace std;

int main()
{
     int n,i,j=0;
     int a[1000];
     cin>>n;
     i=n;
     while(i)
     {
         a[j]=!(i%2);
         i/=2;
         j++;
     }
     for(i=j-1;i>=0;i--)
          cout<<a[i];
     cout << "--> ";
 
     int sum=0, w=1;
     for(i=0;i<j;i++)
      {
           sum += a[i]*w;
            w*=2;
      }
     cout << sum << endl;
     return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin_org

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值