华为机试 (104)

    科技2022-07-13  129

    删除链表指定节点

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

    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 <stdio.h> #include <stdlib.h> #include <malloc.h> 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<stdio.h> 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<iostream> #include<string> #include<vector> #include<algorithm> 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 <stdio.h> 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<stdio.h> #include<string.h> 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<<c[i]; // cout<<endl;// printf("\n");//清除缓存,在C语言中使用换行 } return 0; }
    Processed: 0.013, SQL: 8