输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
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的数字(如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;
}