华为机试——中等题整合(二)

后面修改一下排版。。。

1.

在这里插入图片描述

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

int main()
{
    string s;
    int k;
    while(cin >> s >> k){
        string res = s.substr(0,k);
        cout << res << endl;
    }
    return 0;
}

2.

在这里插入图片描述

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

int main()
{
    string s1,s2;
    while(cin >> s1 >> s2)
    {
        int m = s1.size(), n = s2.size();
        vector<vector<int>> dp(m+1, vector<int> (n+1,0));
        for(int i = 0; i <= m; i++)
            dp[i][0] = i;
        for(int j = 0; j <= n; j++)
            dp[0][j] = j;
        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; j++)
            {
                int min1 = min(dp[i-1][j], dp[i][j-1]) + 1;
                dp[i][j] = min((s1[i-1] == s2[j-1] ? 0 : 1) + dp[i-1][j-1], min1);
            }
        }
        cout << dp[m][n] << endl;
    }
    return 0;
}

3.

在这里插入图片描述


#include <iostream>
using namespace std;
struct ListNode
{
  	int data;
    ListNode *next;
};
int main()
{
    int num ,headvalue;
    while(cin >> num >> headvalue)
    {
        ListNode *p,*head = new ListNode;
        head->data = headvalue;   //先输入第一个数
        head->next = NULL;
        int xin;
        int jiu;
        num--;
        while(num--)              //输入剩余的书
        {
            cin>>xin>>jiu;
            ListNode *q = new ListNode;
            q->data = xin;
            for(p = head; p != NULL; p = p->next)
            {
                if(p->data == jiu)
                {
                    q->next = p->next;
                    p->next = q;
                }
            }                                
        }
        int shanchu;
        cin >> shanchu;
        if(head->data == shanchu)           //要删除的是第一个节点
        {
            head->next = NULL;
        }
        for(p = head; p->next != NULL; p = p->next)     
        {
            if(p->next->data == shanchu)   
                p->next = p->next->next;
        }
        for(p = head; p != NULL; p = p->next)
        {
            cout << p->data <<" ";
        }
        cout << endl;
        
    }    
    return 0;
}

4.

在这里插入图片描述

#include<iostream>

using namespace std;

int main()
{
    int n;
    while(cin >> n)
    {
        int count  = 0;
        if(n < 7)
            return 0;
        for(int i = 7; i <= n; i++){
            if(i % 7 == 0 || i % 10 == 7 || (i % 100)/10 == 7 || (i % 1000)/100 == 7 || (i % 10000)/1000 == 7)
                count++;
        } 
        cout << count <<endl;
    }
    return 0;
}

5.

在这里插入图片描述

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

int main()
{
    string s1, s2;
    while(cin >> s1 >> s2)
    {
        int a ,b;
        a = atoi(s1.c_str());
        b = atoi(s2.c_str());
        cout << a+b << endl;
    }
    return 0;
}

6.

在这里插入图片描述

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

int main()
{
    string s;
    while(cin >> s)
    {
        int res[128] = {0};
        for(int i = 0 ; i < s.size(); i++)
        {
            res[s[i]]++;
        }
        int flag = 0;
        for(int i = 0; i < s.size(); i++)
        {
            if(res[s[i]] == 1){
                cout << s[i] << endl;
                flag = 1;
                break;
            }
        }
        if(!flag){
            cout << -1 << endl;
        }
        flag = 0;
    }
    return 0;
}

7.

在这里插入图片描述

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

int main()
{
    string s;
    int num;
    while(cin >> s >> num)
    {
        double max_ratio = 0;
        double cur_ratio = 0;
        string res = "";
        int count = 0;
        int fir = 0, sec = num-1;
        string temp = s.substr(fir,num);
        while(sec < s.size()){
            for(int i = 0; i < num; i++)
            {
                if(temp[i] == 'C' || temp[i] == 'G')
                    count++;
            }
            cur_ratio = (count*1.0)/num;
            if(cur_ratio > max_ratio)
            {
                max_ratio = cur_ratio;
                res = temp;
            }
            count = 0;
            fir++;
            sec++;
            temp = s.substr(fir,num);
        }
        cout << res << endl;
    }
    return 0;
}

8.

在这里插入图片描述

#include<iostream>
#include<vector>
#include<string>
using namespace std;
void findMaxCommonStr(string s1,string s2)
{
    if(s1.length()>s2.length())
            swap(s1,s2);//s1用于保存较短的子串
    int len1=s1.length(),len2=s2.length();
    int maxLen=0,start=0;
    vector<vector<int> >dp(len1+1,vector<int>(len2+1,0));
    for(int i=1;i<=len1;++i)
        for(int j=1;j<=len2;++j)
        {
            if(s1[i-1]==s2[j-1])
            {
                dp[i][j]=dp[i-1][j-1]+1;
                if(dp[i][j]>maxLen)
                {
                    maxLen=dp[i][j];
                    start=i-maxLen;//记录最长公共子串的起始位置
                }
            }
        }
   cout<<s1.substr(start,maxLen)<<endl;
}
int main()
{
   string s1,s2;
   while(cin>>s1>>s2)
   {
       findMaxCommonStr(s1,s2);
   }
   return 0;
}

9.

在这里插入图片描述

//搞了半天原来是可以有括号的,全排列+递归就可以了,而全排列本身又可以递归来做。
//不要忘记恢复现场就行。
#include<iostream>
using namespace std;

inline void Swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

bool is24(int a[], int begin, int end, double tot)
{
	if (begin==end-1) return (a[begin] == tot);
	else
	{
		bool ans = false;
		for (int i = begin; i<end; i++)
		{
			swap(a[i], a[end-1]);
			ans = ans || is24(a, begin, end - 1, tot + a[end - 1]) || is24(a, begin, end - 1, tot - a[end - 1]) || is24(a, begin, end - 1, tot * a[end - 1]) || is24(a, begin, end - 1, tot / a[end - 1]);
			swap(a[i], a[end-1]);
		}
		return ans;
	}

}

int main()
{
	int a[4];
	while (cin >> a[0] >> a[1] >> a[2]>>a[3])
	{
		if (is24(a, 0,4, 24)) cout << "true" << endl;
		else cout << "false" << endl;
	}
}

10.

在这里插入图片描述

#include<iostream>
#include<vector>

using namespace std;

int main()
{
    int x,y,z;
    while(cin>> x >> y >> z)
    {
        vector<vector<int>> a(x+1,vector<int>(y+1,0));
        vector<vector<int>> b(y+1,vector<int>(z+1,0));
        vector<vector<int>> res(x+1,vector<int>(z+1,0));
        for(int i = 1 ;i <= x; i++)
        {
            for(int j = 1; j <= y; j++)
                cin >> a[i][j];
        }
        for(int i = 1 ;i <= y; i++)
        {
            for(int j = 1; j <= z; j++)
                cin >> b[i][j];
        }
        for(int i = 1; i <= x; i++)
        {
            for(int j = 1; j <= z; j++)
            {
                for(int k = 1; k <= y; k++)
                {
                    res[i][j] += a[i][k]*b[k][j];
                }
            }
        }
        for(int i = 1; i <= x; i++)
        {
            for(int j = 1; j <= z; j++)
            {
                cout << res[i][j] << " " ;
            }
            cout << endl;
        }
    }
    return 0;
}

11.

在这里插入图片描述

#include<string>
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int main()
{
	int N;
	while (cin >> N)
	{
		vector<vector<int>> V(N, vector<int>(2, 0));//初始化二维数组
		string rule;
		for (auto &i : V)
			for (auto &j : i)
				cin >> j;
		cin >> rule;
		int count = 0;
		stack<char> cal;//存储表达式的字母
		for (int i = 0; i < rule.size(); i++)
		{
			if (rule[i] == ')')
				if (cal.size()!=1)
				{
					vector<int> temp2 = V[cal.top() - 'A'];
					cal.pop();
					vector<int> &temp1 = V[cal.top() - 'A'];
					count += temp1[1] * temp1[0] * temp2[1];
					temp1[1] = temp2[1];
				}
				else;
			else if (rule[i] != '(')
				cal.push(rule[i]);
		}
		cout << count << endl;
	}
	return 0;
}

12.

在这里插入图片描述

#include <iostream>
using namespace std;

int main()
{
    string regex;
    string str;
    while(cin>>regex>>str)
    {

        int j=0;
        int i=0;
        bool flag = false;
        while(str[i]!='\0'||regex[j]!='\0')
        {   
            if(regex[j]=='*')
            {
                j++;
                flag=true;
            }
            else if(str[i]==regex[j]||regex[j]=='?')
            {
                i++;
                j++;
            }
            else if(flag==true)
              {
                while(str[i]!=regex[j])
                {
                    i++;
                }
                flag = false;
              }   
            else 
              {
                cout<<"false"<<endl;            
                break;
               }
            }
           if(str[i]=='\0'&&str[j]=='\0')
           {
               cout<<"true"<<endl;
           }
 
        }
          return 0;  
        
    }



13.

在这里插入图片描述

#include<iostream>
using namespace std;
char str1[15],str2[15],str[105];
int a[15],b[15],lena,lenb;
int main(){
    while(cin.getline(str,100)){
        int flag=0,len1=0,len2=0;
        for(int i=0;str[i]!=0;i++){
            if(str[i]=='-'){
                flag=1;
                i++;
            }
            if(flag==0){
                str1[len1++]=str[i];
            }else{
                str2[len2++]=str[i];
            }
        }
        //拆到两个数字类型的数组里
        if(len1==11){
            cout<<str1<<endl;
        }else if(len2==11){
            cout<<str2<<endl;
        }else{
            lena=0,lenb=0;
            //处理数组变成数字类型数组
            for(int i=0;i<len1;i++){
                if(str1[i]=='A'){
                    a[lena++]=14;
                }else if(str1[i]=='J'){
                    a[lena++]=11; 
                }else if(str1[i]=='Q'){
                    a[lena++]=12;
                }else if(str1[i]=='K'){
                    a[lena++]=13;
                }else if(str1[i]>='0'&&str1[i]<='9'){
                    int tmp=0;
                    do{
                        tmp=tmp*10+str1[i]-'0';
                        i++;
                    }while(str1[i]>='0'&&str1[i]<='9');
                    a[lena++]=tmp;
                }
            } 
            for(int i=0;i<len2;i++){
                if(str2[i]=='A'){
                    b[lenb++]=1;
                }else if(str2[i]=='J'){
                    b[lenb++]=11; 
                }else if(str2[i]=='Q'){
                    b[lenb++]=12;
                }else if(str2[i]=='K'){
                    b[lenb++]=13;
                }else if(str2[i]>='0'&&str2[i]<='9'){
                    int tmp=0;
                    do{
                        tmp=tmp*10+str2[i]-'0';
                        i++;
                    }while(str2[i]>='0'&&str2[i]<='9');
                    b[lenb++]=tmp;
                }
            }
            if(lena==lenb){
                if(a[0]>b[0]){
                    cout<<str1<<endl;
                }else{
                    cout<<str2<<endl;
                }
            }else if(lena==4){
                cout<<str1<<endl;
            }else if(lenb==4){
                cout<<str2<<endl;
            }else{
                printf("ERROR\n");
            }
        }
    }
}

14.

在这里插入图片描述

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    string s;
    while(cin >> s){
        int n=s.size();vector<int> v;bool isValid=true;
        int num_i=count(s.begin(),s.end(),'.');
        if(num_i!=3)
            cout << "NO" <<endl;
        for(int i=0;i<4;i++){
            int index=s.find('.');
            v.push_back(stoi(s.substr(0,index)));
            s=s.substr(index+1);
        }
        for(int i=0;i<v.size();i++){
            if(v[i]<0 || v[i]>255)
                isValid=false;
        }
        if(isValid)
            cout << "YES" <<endl;
        else
            cout << "NO" <<endl;
    }
}

15.

在这里插入图片描述

//检测到数字,则在数字前添加“*”,随即检测后几位,如果检测到字母或其他,则添加“*”
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string a;
	while (cin >> a)
	{
		for (int i = 0; i < a.size(); i++)
		{
			int stop = 0;
			if (isdigit(a[i]))
			{
				a.insert(i,"*");
				i++;
			}
			while (isdigit(a[i]))
			{
				stop = i + 1;
				i++;
			}
			if (stop)
				a.insert(stop, "*");
		}
		cout << a << endl;	
	}
	return 0;
}

16.

在这里插入图片描述

#include<iostream>
using namespace std;
int main() {
	int n;
	while (cin >> n) {
		int base = 10, count = 0;
		for (int i = 0; i <= n; i++) {
			if (i == base) base *= 10;
			if (i*i%base == i)
				count++;
		}
		cout << count << endl;
	}
	return 0;
}

17.

在这里插入图片描述

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
	string st;
	while (getline(cin, st))
	{
		int a[128] = {0}, i, j, b[128] = {0};
		for (i = 0; i < st.length(); ++i)
		{
			a[st[i]]++;
			b[st[i]]++;
		}
		sort(a, a + 128);
		sort(st.begin(), st.end());
		for (i = 127; i >= 0; --i)
		{
			if (a[i] == 0)break;
			for (j = 0; j < st.length(); ++j)
			{
				if (b[st[j]] == a[i])
				{
					cout << st[j];
					b[st[j]] = 0;
					break;
				}
			}
		}
		cout << endl;
	}
	return 0;
}

18.

在这里插入图片描述

#include<iostream>
#include<stdio.h>
#include<vector>

using namespace std; //动态规划

int main(){
    int N;
    while(cin>>N){
    	vector<int> Data(N,0);
        vector<int> Dp(N,1);
        int ret = 0;
        for(int i=0; i<N; ++i){
            cin >> Data[i];
            for(int j=0; j<i; j++){
                if(Data[i]>Data[j])
                    Dp[i] = max(Dp[i],Dp[j]+1);
            }
            ret = max(ret,Dp[i]);
        }
        cout<< ret<<endl;
    }
    return 0;
}

19.

在这里插入图片描述

#include<iostream>
#include<iomanip>
//牛顿法
using namespace std;
double newton(double a){
	double x = 1;
	while (((x*x*x - a) >= 1e-7) || ((a - x*x*x) >= 1e-7)){
		x = (x - x / 3 + a / (3 * x*x));
	}
	return x;
}

int main(){
	double num;
	while (cin >> num){
		cout << setprecision(1) << fixed << newton(num) << endl;
	}
	return 0;
}```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值