华为机试 (10/4)

删除链表指定节点

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。

import java.io.*;
public class Main {
    //构建节点
    public static class Node {
        Node next;
        int val;
        Node(int val) {
            this.val = val;
            next = null;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = null;
        while ((str = br.readLine()) != null) {
            if (str.equals("")) continue;
            String[] params = str.split(" ");//str.split(" ")将字符串按空格分开并返回为字符串数组的形式
            int n = Integer.parseInt(params[0]);
            Node head = new Node(Integer.parseInt(params[1]));//将字符串数字默认转换为整型的十进制数,使用的是Integer类
            for (int i = 1; i < n; i++) {
                int pre = Integer.parseInt(params[2*i+1]), nxt = Integer.parseInt(params[2*i]);
                Node temp = head;
                while (temp.val != pre) temp = temp.next;//遍历插入点的位置
                Node node = new Node(nxt);
                node.next = temp.next;
                temp.next = node;
            }
            int del = Integer.parseInt(params[2*n]);
            StringBuilder ans = new StringBuilder();//StringBuilder类可以更改字符串,不会占用多余的空间,始终是一个数组
            Node temp = head;
            while (temp != null) {
                if (temp.val != del) ans.append(temp.val).append(" ");//append为StringBuilder类中添加字符串的方法
                temp = temp.next;
            }
            // 注意要求每个数后面都加空格
            System.out.println(ans.toString());//转换为字符串格式
        }
    }
}

#include 
#include 
#include 
typedef struct Node{
    int value;
    struct Node *next;
}LinkList;
LinkList * add_Node(LinkList *head,LinkList *newNode,int x,int y){
    LinkList *q,*p;
    p = head;
    q = newNode;
    q->value = x; 
    while((p->value) != y){
        p = p->next;
    }
    q->next = p->next;
    p->next = q;
    
    return q;
}
LinkList * del_Node(LinkList *head,int val){
    LinkList *q,*p;
    p = head;
    if(val == head->value){//判断删除的是不是链表头
        head = head->next;
    }
    while(p->next->value != val){
        p = p->next;
    }
    p ->next= p->next->next;
        return head;
}    
int main(){
    int val,n,i,x,y;
    LinkList *head,*p;
    while(scanf("%d",&n) != EOF){  
        p =  (LinkList *)malloc(sizeof(LinkList));
        head = p;
        scanf("%d",&val);
        head->value = val;
        //head->next=head;
        head->next=NULL;
        for(i = 1;i<n;i++){          
            scanf("%d %d",&x,&y);
            p = (LinkList *)malloc(sizeof(LinkList));
            add_Node(head,p,x,y);//x后面插入值为y节点
        }
        scanf("%d",&val);
        p = del_Node(head,val);
        head = p;//输出链表内容
        while(p->next != NULL){
            printf("%d ",p->value);
            p = p->next;
        }
        printf("%d \n",p->value);
    }
    return 0;
}

多线程

问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD,ABCD的个数由线程函数1的参数指定。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str;
        while((str=br.readLine())!=null){
            int n=Integer.parseInt(str);
            StringBuilder output=new StringBuilder();
            for(int i=0;i<n;i++){
                output.append("ABCD");
            }
            System.out.println(output.toString());
        }
    }
}
#include
 
int main()
{
    int N;
    while(scanf("%d", &N)!=EOF)
    {
        while(N--)
        {
            printf("%s", "ABCD");
        }
        printf("\n");
    }
}

计算字符串的距离

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。
Ex:
字符串A:abcdefg
字符串B: abcdef
通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。
要求:
给定任意两个字符串,写出一个算法计算它们的编辑距离。

在这里插入代码片
#include
#include
#include
#include
using namespace std;
//空间可以优化成O(n)
int main() {
    string s1, s2;
    while (cin >> s1 >> s2) {
        vector<vector<int>> dp(s1.size() + 1, vector<int>(s2.size() + 1, 0));
        for (int i = 1; i <= s2.length(); i++) dp[0][i] = i;
        for (int i = 1; i <= s1.length(); i++) dp[i][0] = i;
        for(int i=1;i<=s1.length();i++)
            for (int j = 1; j <= s2.length(); 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[s1.size()][s2.size()] << endl;
    }
}

挑7

输出7有关数字的个数,包括7的倍数,还有包含7的数字(如17,27,37…70,71,72,73…)的个数(一组测试用例里可能有多组数据,请注意处理)

在这里插入代码片
#include 
int main()
{
    int N;
    int i = 8;
    int j;
    int r = 1;
    while(scanf("%d", &N) != EOF)
    {    
        i = 8;
        r = 1;
    while(i <= N)
    {
        if(i % 7 == 0)
        {
            r++;
            i++;
            continue;
        }
        j = i;
        while(j > 10)
        {
            if(j % 10 == 7)
            {
                r++;
                break;
            }
            j = j / 10;
        }
        if(j == 7)
        {
            r++;
        }
        i++;
    }
    printf("%d\n", r);
    }
}

高精度整数加法

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,
参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊
的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:
9876543210 + 1234567890 = ?
让字符串 num1=“9876543210”,字符串 num2=“1234567890”,结果保存在字符串 result = “11111111100”。
-9876543210 + (-1234567890) = ?
让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = “-11111111100”。

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main{
    public static void main(String [] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str1 ;
        while((str1 = br.readLine())!=null){
            if(str1.equals(" ")){
                continue;
            }
            String str2 = br.readLine();
            StringBuffer sb1 = new StringBuffer(str1.trim()); //注意去掉最后的那个空格,不然会导致出怪
            StringBuffer sb2 = new StringBuffer(str2.trim());
            while(sb1.length() != sb2.length()){ //题目都是正数的加减
                if(sb1.length() > sb2.length()){
                    sb2.insert(0,'0');
                }else{
                    sb1.insert(0,'0');
                }
            }
            str1 = sb1.toString();
            str2 = sb2.toString();
            int j = 0 , jw = 0 ;//个位和十位
            StringBuffer sb3 = new StringBuffer();
            for(int i = sb1.length()-1 ; i>=0;i--){ //
                int a = str1.charAt(i)-'0';//强制数据类型转换
                int b = str2.charAt(i)-'0';
                int c = a+b+jw;
                j = c%10;
                jw = c/10;
                sb3.insert(0,j);
            }
            if(jw>0){
                sb3.insert(0,jw);
            }
            System.out.println(sb3.toString());
        }
        br.close();
    }
}
#include
#include 
int main(void)
{
    char s1[1000];
    char s2[1000];//int lenA,lenB;
    while(scanf("%s%s",s1,s2)!=EOF)
    {
        int a[100]={0};
        int b[100]={0};
        int c[100] ={0};
        int lenA = strlen(s1);
        int lenB =strlen(s2);
        for(int i =0; i<lenA; i++)
            a[i] = s1[lenA-1-i] - '0';
        for(int i =0; i<lenB; i++)
            b[i] = s2[lenB-1-i] - '0';
        int lenC =0;
        int x = 0;
 
        while(lenC<lenA || lenC<lenB)
        {
            c[lenC] = a[lenC] + b[lenC] + x;
            x = c[lenC]/10;
            c[lenC] = c[lenC]%10;
            lenC++;
        }
        c[lenC] = x;
        if(c[lenC] == 0)
            lenC--;
        for(int i =lenC; i>=0; i--)
           printf("%d",c[i]);// cout<
       // cout<
    printf("\n");//清除缓存,在C语言中使用换行
    }
    return 0;
}

你可能感兴趣的:(算法学习,华为机试)