【華為機試線上訓練】Day 11

HelloZEX發表於2018-08-10

計算字串的相似度

題目描述

對於不同的字串,我們希望能有辦法判斷相似程度,我們定義了一套操作方法來把兩個不相同的字串變得相同,具體的操作方法如下:

1 修改一個字元,如把“a”替換為“b”。

2 增加一個字元,如把“abdd”變為“aebdd”。

3 刪除一個字元,如把“travelling”變為“traveling”。

比如,對於“abcdefg”和“abcdef”兩個字串來說,我們認為可以通過增加和減少一個“g”的方式來達到目的。上面的兩種方案,都只需要一次操作。把這個操作所需要的次數定義為兩個字串的距離,而相似度等於“距離+1”的倒數。也就是說,“abcdefg”和“abcdef”的距離為1,相似度為1/2=0.5.

給定任意兩個字串,你是否能寫出一個演算法來計算出它們的相似度呢?

請實現如下介面

 /* 功能:計算字串的相似度
  * 輸入:pucAExpression/ pucBExpression:字串格式,如: "abcdef"
  * 返回:字串的相似度,相似度等於“距離+1”的倒數,結果請用1/字串的形式,如1/2
  */
 public static  String  calculateStringDistance(String expressionA, String expressionB)
 {
     /* 請實現*/
     return null;
 }

約束:

1、PucAExpression/ PucBExpression字串中的有效字元包括26個小寫字母。

2、PucAExpression/ PucBExpression算術表示式的有效性由呼叫者保證;
3、超過result範圍導致資訊無法正確表達的,返回null。

輸入描述:

輸入兩個字串

輸出描述:

輸出相似度,string型別

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

int main() 
{
	string a, b;

	while (cin >> a >> b) 
	{
		string res = "1/";
		int n = (int)a.size(), m = (int)b.size();
		vector<vector<int>>dp(n + 1, vector<int>(m + 1, 0));
		dp[0][0] = 0;//dp[x][y]代表將a字串前x個字元修改成b字串前y個字元
		for (int i = 1; i <= m; ++i) dp[0][i] = i;
		for (int i = 1; i <= n; ++i) dp[i][0] = i;
		for (int i = 1; i <= n; ++i)
		{
			for (int j = 1; j <= m; ++j) 
			{
				int one = dp[i - 1][j] + 1, two = dp[i][j - 1] + 1, three = dp[i - 1][j - 1];
				if (a[i - 1] != b[j - 1]) 
					three += 1;
				dp[i][j] = min(min(one, two), three);
			}
		}

		res += to_string(1 + dp[n][m]);

		cout << res << endl;
	}
	return 0;
}

參考:http://www.cnblogs.com/yujunyong/articles/2004724.html

 



判斷兩個IP是否屬於同一子網

題目描述

子網掩碼是用來判斷任意兩臺計算機的IP地址是否屬於同一子網路的根據。
子網掩碼與IP地址結構相同,是32位二進位制數,其中網路號部分全為“1”和主機號部分全為“0”。利用子網掩碼可以判斷兩臺主機是否中同一子網中。若兩臺主機的IP地址分別與它們的子網掩碼相“與”後的結果相同,則說明這兩臺主機在同一子網中。

示例:
I P 地址  192.168.0.1
子網掩碼  255.255.255.0

轉化為二進位制進行運算:

I P 地址 11010000.10101000.00000000.00000001
子網掩碼 11111111.11111111.11111111.00000000

AND運算
     11000000.10101000.00000000.00000000

轉化為十進位制後為:
     192.168.0.0

 

I P 地址  192.168.0.254
子網掩碼  255.255.255.0


轉化為二進位制進行運算:

I P 地址 11010000.10101000.00000000.11111110
子網掩碼 11111111.11111111.11111111.00000000

AND運算
     11000000.10101000.00000000.00000000

轉化為十進位制後為:
     192.168.0.0

通過以上對兩臺計算機IP地址與子網掩碼的AND運算後,我們可以看到它運算結果是一樣的。均為192.168.0.0,所以這二臺計算機可視為是同一子網路。

/* 
* 功能: 判斷兩臺計算機IP地址是同一子網路。 
* 輸入引數:    String Mask: 子網掩碼,格式:“255.255.255.0”; 
*               String ip1: 計算機1的IP地址,格式:“192.168.0.254”;
*               String ip2: 計算機2的IP地址,格式:“192.168.0.1”;
*               

* 返回值:      0:IP1與IP2屬於同一子網路;     1:IP地址或子網掩碼格式非法;    2:IP1與IP2不屬於同一子網路
*/ 
public int checkNetSegment(String mask, String ip1, String ip2) 
{     
    /*在這裡實現功能*/
    return 0;
}

輸入描述:

輸入子網掩碼、兩個ip地址

輸出描述:

得到計算結果

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    char str[16] = {'\0'};
    while (cin>>str)
    {
        int a[4] = { 0 }, b[4] = { 0 }, c[4] = { 0 };
        char e[5] = { '\0' }, ch;
        int i = 0, j = 0, k = 0, sign = 0;
        for (i = 0;str[i] != '\0';i++)
        {
            if (str[i] == '.')
            {
                e[j] = '\0';
                a[k] = stoi(e);
                j = 0;
                k++;
 
            }
            else
            {
                e[j] = str[i];
                j++;
            }
        }
        e[j] = '\0';
        a[k] = stoi(e);
        cin >> b[0] >> ch >> b[1] >> ch >> b[2] >> ch >> b[3];
        cin >> c[0] >> ch >> c[1] >> ch >> c[2] >> ch >> c[3];
        if (a[0] == 255 && a[1] == 0 && b[3] == 15)
            sign = 1;
        if (sign == 1)
            cout << sign << endl;
        else
        {
            for (i = 0;i < 4;i++)
            {
                if ((a[i] & b[i]) != (a[i] & c[i]))
                    sign = 2;
            }
            cout << sign << endl;
        }
    }
    return 0;
}

 

相關文章