LeetCode刷题计划---day3

卡码网 练习ACM模式 https://kamacoder.com/

11

LeetCode刷题计划---day3_第1张图片

可用静态链表存储树,最后求某个结点到共同树根的长度。

#include 
#include 
using namespace std;



int main()
{
    int n;
    int a,b;
    vector<int> nums = vector<int>(30,0);
    
    while(cin>>n)
    {
        while(n--){
 
            cin>>a>>b;
            nums[a]=b;
        }
            int len_ming = 0;
            int len_yu =0;
            int ming = nums[1];
            int yu = nums[2];
            while(ming !=0){
                ming = nums[ming];
                len_ming++;
            }
            while(yu!=0){
                yu = nums[yu];
                len_yu++;
            }
                
        
        if(len_ming>len_yu)
            cout<<"You are my elder"<<endl;
        else if(len_ming==len_yu)
            cout<<"You are my brother"<<endl;
        else if(len_yu>len_ming)
            cout<<"You are my younger"<<endl;
        }

    
    return 0;
}
while True:
    try:
        n = int(input())
        relations = {}
        for _ in range(n):
            a, b = map(int, input().split())
            relations[a] = b

        len_ming = 0
        len_yu = 0
        ming = relations.get(1, 0)
        yu = relations.get(2, 0)

        while ming != 0 and ming in relations:
            ming = relations[ming]
            len_ming += 1
        while yu != 0 and yu in relations:
            yu = relations[yu]
            len_yu += 1

        if len_ming > len_yu:
            print("You are my elder")
        elif len_ming == len_yu:
            print("You are my brother")
        else:
            print("You are my younger")

    except EOFError:
        break

在访问 relations[ming] 之前,先判断一下 ming 是否在 relations 字典的键中。如果 ming 不在字典中,则说明已经找到了最后一个人,应该跳出循环。


12

LeetCode刷题计划---day3_第2张图片

#include 

int main() {
    int n;
    while (std::cin >> n) {
        // 输出上半部分
        for (int i = 1; i <= n; i++) {
            // 输出前面的空格
            for (int j = 1; j <= n - i; j++) {
                std::cout << " ";
            }
            // 输出左半部分的数字
            for (int j = 1; j <= i; j++) {
                std::cout << j;
            }
            // 输出右半部分的数字
            for (int j = i - 1; j >= 1; j--) {
                std::cout << j;
            }
            // 输出后面的空格和换行符
            std::cout << std::endl;
        }

        // 输出下半部分
        for (int i = n - 1; i >= 1; i--) {
            // 输出前面的空格
            for (int j = 1; j <= n - i; j++) {
                std::cout << " ";
            }
            // 输出左半部分的数字
            for (int j = 1; j <= i; j++) {
                std::cout << j;
            }
            // 输出右半部分的数字
            for (int j = i - 1; j >= 1; j--) {
                std::cout << j;
            }
            // 输出后面的空格和换行符
            std::cout << std::endl;
        }
    }
    return 0;
}


while True:
    try:
        n = int(input().strip())
        # 输出上半部分
        for i in range(1, n+1):
            # 输出前面的空格
            print(" " * (n-i), end="")
            # 输出左半部分的数字
            for j in range(1, i+1):
                print(j, end="")
            # 输出右半部分的数字
            for j in range(i-1, 0, -1):
                print(j, end="")
            # 输出后面的空格和换行符
            print()
        # 输出下半部分
        for i in range(n-1, 0, -1):
            # 输出前面的空格
            print(" " * (n-i), end="")
            # 输出左半部分的数字
            for j in range(1, i+1):
                print(j, end="")
            # 输出右半部分的数字
            for j in range(i-1, 0, -1):
                print(j, end="")
            # 输出后面的空格和换行符
            print()
    except:
        break


13

LeetCode刷题计划---day3_第3张图片

#include 
using namespace std;

int main() {
    char c;
    int n;
    while (cin >> c >> n) {
        if (c == '@') break;

        for (int i = 1; i <= n; i++) {
            if (i == n) {
                for (int j = 0; j < 2 * n - 1; j++) {
                    cout << c;
                }
            } else {
                for (int j = 0; j < 2 * n - 1; j++) {
                    if (j == n - i || j == n + i - 2) cout << c;
                    else cout << " ";
                }
            }

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

while True:
    
    try:
        s = list(input().split())
        a = s[0]
        n = int(s[1])
     
        if a == '@':
           break
        else:
            for i in range(1,n+1):
                
                if i ==n:
                    print(a*(2*n-1))
                else:
                    for j in range(2*n-1):
                        if (j==n+i-2) or (j==n-i) :
                            print(a,end="")
                           
                        else:
                            print(' ',end="")
                    print()
                            
        print()
        
    except:
        break

Python中的print函数可以通过指定end参数来设置输出结尾字符,默认为换行符“\n”。在输出空格时,应该输出一个空格字符,而不是一个空字符串。


14

LeetCode刷题计划---day3_第4张图片

读取 n 后使用 cin.ignore() 来清除缓冲区中的换行符,然后再使用 getline(cin, s) 读取字符串。
cin.ignore(); // 清除换行符

#include 
#include 
#include 
#include 
using namespace std;

int main() {
    int n;
    cin >> n;
    cin.ignore(); // 清除换行符

    while (n) {
        string s;
        getline(cin, s);

        string abbreviation;
        istringstream iss(s);
        string word;

        while (iss >> word) {
            abbreviation += toupper(word[0]);
        }

        cout << abbreviation << endl;
        n--;
    }

    return 0;
}

使用了一个 istringstream 类型的对象 iss,它可以将字符串按照空格分割成一个个单词。iss >> word 的含义就是从输入流中提取下一个单词,并将其存储到字符串变量 word 中。
在 C++ 中,对于字符串的拼接操作,使用 + 和 += 运算符的区别在于:
使用 + 运算符:

当你使用 s1 = s1 + toupper(word[0]); 这样的表达式时,实际上是创建了一个新的临时字符串,其中包含了将 s1 和 toupper(word[0]) 拼接后的结果,然后将这个新的字符串赋值给 s1。这意味着原始的 s1 字符串会被销毁,而新的字符串会分配内存来存储拼接后的结果。
使用 += 运算符:

当你使用 s1 += toupper(word[0]); 这样的表达式时,它会直接将 toupper(word[0]) 添加到 s1 的末尾,而不会创建新的临时字符串。这种方式更高效,因为它避免了不必要的内存分配和复制操作。

while True:
    try:
        n = int(input())
        for i in range(n):
            s = input().split()
            s1 = ''
            for j in range(len(s)):
               
                s1 = s1+s[j][0]
                
            s_upper = s1.upper()
            print(s_upper)
        
    except:
        break

使用了字符串相加 + 的方式,这会将新的字符添加到已有字符串的末尾,注意前后关系
s.upper() 返回一个新的字符串,其中所有的小写字母都被转换为大写字母s.lower() 返回一个新的字符串,其中所有的大写字母都被转换为小写字母。


15

LeetCode刷题计划---day3_第5张图片

LeetCode刷题计划---day3_第6张图片

#include 
using namespace std;

int main()
{
    int n;
    while(cin>>n){
        cin.ignore(); // 忽略换行符
        while(n--){
            string s1;
            string s2;
            getline(cin,s1);
            int len;
            len = s1.length();
            if(len %2!=0)
            {
                break;
            }
            else
            {
                getline(cin,s2);
               
                s1.insert(s1.size()/2,s2);
                cout<<s1<<endl;
            }
            

        }
        
        
    }
    

    
    return 0;
}

使用了 getline(cin, s1) 和 getline(cin, s2) 来读取输入的字符串。但是要注意,当之前使用 cin >> n 读取整数时,输入流中可能会有一个换行符残留在缓冲区中。这个换行符会被 getline 函数读取到,并导致第一个 getline 函数直接返回空字符串。

为了解决这个问题,可以在读取整数后,使用 cin.ignore() 来忽略剩余的换行符,然后再开始读取字符串。

while True:
    
    
    try:
        n = int(input())
        for i in range(n):
            s1 = input()
            s2 = input()
            index = len(s1) // 2  # 计算插入位置
            s1 = s1[:index] + s2 + s1[index:]  # 将 s2 插入到 s1 的中间位置
            print(s1)
    except:
        break

LeetCode刷题计划---day3_第7张图片

#include 
using namespace std;


int main()
{
    
    int n;
    cin>>n;
    cin.ignore();
    while(n>0){
        string s;
        char temp;
        getline(cin,s);
        int len;
        len = s.length();
        for (int i = 0;i<len;i++){
            if(i%2==0)
            {
                temp=s[i];
                s[i]=s[i+1];
                s[i+1]=temp;
            }
           
        
        }
        cout<<s<<endl;
        n--;
    }
    
    
    return 0;
}
while True:
    
    try:
        n = int(input())
        for i in range(n):
            s = list(input())
            for i in range(len(s)):
                temp = ''
                if i%2 ==0:
                    temp = s[i]
                    s[i] = s[i+1]
                    s[i+1] = temp
                    
                    
            print(''.join(s))
        
    except:
        break

在 Python 中,字符串是不可变的(immutable),因此无法通过索引赋值的方式来修改字符串中的单个字符。
使用 list() 函数将输入的字符串转换为列表,并使用 join() 方法将列表转换回字符串

你可能感兴趣的:(leetcode,算法,职场和发展)