DataStruct Based on String!

Posted 小淼博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataStruct Based on String!相关的知识,希望对你有一定的参考价值。

Que1:两个字符串中的字符相同,出现的次数也相同,但是出现的顺序不同则认为这两个字符串是兄弟字符串。(eg:“ADB”和“DBA”就是兄弟字符串)现在提供一对字符串,如何确定他们是否是兄弟字符串?

采用散列表的方式来解决这个问题,由于不考虑排列的问题,所以只需要记录出现的次数就可以了!详细的程序如下所示:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <stdbool.h>
 5 
 6 bool StringBrother(const char *str0, const char *str1);
 7 
 8 int main()
 9 {
10     char *str0 = malloc(sizeof(char)*100);
11     char *str1 = malloc(sizeof(char)*100);
12     scanf("%s",str0);
13     scanf("%s",str1);
14     if(StringBrother(str0,str1))
15     {
16         printf("GOOD BROTHER!\\n");
17     }
18     else
19     {
20         printf("NOT BROTHER!\\n");
21     }
22     return 0;
23 }
24 bool StringBrother(const char *str0, const char *str1)
25 {
26     int len0,len1,i,pos,param[26]={0};
27     len0 = strlen(str0);
28     len1 = strlen(str1);
29     if(len0 != len1) return false;
30     printf("String\'s content:\\n");
31     for(i=0;i<len0;i++)
32     {
33         pos = *(str0+i) - \'A\';
34         param[pos] += 1;
35         pos = *(str1+i) - \'A\';
36         param[pos] -= 1;
37         printf("The param0[%d] is:%d\\n",pos,param[pos]);
38     }
39     for(i=0;i<26;i++)
40     {
41         if(param[i] != 0) return false;
42     }
43     return true;
44 }

输出测试结果如下所示:

Que2:数字转字符串C语言函数实现方法,任意一个int整数类型的数据转换为string类型

 1 int num2str(char *str,int num) // 返回len
 2 {
 3     int temp, i = 0, j;
 4     while (1) {  // Transform the number
 5         temp = num % 10;
 6         str[i] = char(temp + 48);
 7         i++;
 8         num /= 10;
 9         if (num == 0) break;
10     }
11     for (j = 0; j < i / 2; j++) { // reverse the number
12         temp = str[j];
13         str[j] = str[i - j - 1];
14         str[i - j - 1] = temp;
15     }
16     return i;
17 }

char *str为保存字符串数据的地址空间

int num为需要转换的整型数据

Que3: 随机输入四个数字,求解满足数字通过加减乘除的方式得到24,求解成功输出计算的算式:

  1 /* 导入头文件 */
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <libgen.h>
  5 #include <string.h>
  6 
  7 /* 宏定义基本的加减乘除运算 */
  8 #define sub(A,B) A>B?A-B:B-A
  9 #define div(A,B) A>B?A/B:B/A
 10 #define mul(A,B) A*B
 11 #define sum(A,B) A+B
 12 
 13 /* 函数声明过程 方便调用 */
 14 int four_calc_try(float p1,float p2, float A, float B, float C, float D, char o, char p);
 15 int all_seq_try(float A,float B,float C,float D);
 16 int Get_Methed_Func(float *N);
 17 
 18 
 19 /* 主函数main */
 20 int main ( int argc, char *argv[] )
 21 {
 22     float X[4] = {0}; // 定义并初始化数字变量X
 23     if(argc < 2){ // 判读main文件运行的方式 直接参数方式或者手动循环输入方式
 24         while(1){
 25             printf("Please enter four number:");
 26             scanf("%f %f %f %f",X+0,X+1,X+2,X+3); // 输入参数
 27             printf("The number you input:%.1f %.1f %.1f %.1f\\n",X[0],X[1],X[2],X[3]); // 打印数字参数
 28             if(!Get_Methed_Func(X)) { printf("No Result!\\n"); } // 调用计算函数 并返回运算结果
 29         }
 30     }
 31     else{
 32         X[0] = atof(argv[1]); // 输入参数转化为浮点数
 33         X[1] = atof(argv[2]); // 输入参数转化为浮点数
 34         X[2] = atof(argv[3]); // 输入参数转化为浮点数
 35         X[3] = atof(argv[4]); // 输入参数转化为浮点数
 36         printf("The number you input:%.1f %.1f %.1f %.1f\\n",X[0],X[1],X[2],X[3]); // 参数打印
 37         if(!Get_Methed_Func(X)) { printf("No Result!\\n"); } // 计算结果
 38     }
 39     return 1;
 40 }
 41 
 42 /* 具体的函数方法实现 */
 43 
 44 /* 尝试两个part之间的不同算式的运算情况(+-x/) 判断计算的结果是否满足24 并退出*/
 45 int four_calc_try(float p1,float p2, float A, float B, float C, float D, char o, char p)
 46 {
 47     float R;
 48     R = sum(p1,p2); if(R == 24){printf("(%.1f%c%.1f)+(%.1f%c%.1f)=%.1f\\n",A,o,B,C,p,D,R); return 1;} // 加法判断
 49     R = sub(p1,p2); if(R == 24){if(p1>p2){printf("(%.1f%c%.1f)-(%.1f%c%.1f)=%.1f\\n",A,o,B,C,p,D,R);}else{printf("(%.1f%c%.1f)-(%.1f%c%.1f)=%.1f\\n",C,p,D,A,o,B,R);} return 1;} // 减法判断
 50     if(p1 < 0 && p2 > 0 || p1 > 0 && p2 < 0) return 0; // 乘法和除法的提前判断,如果一正一负则不用再计算乘除!(提高效率)
 51     R = mul(p1,p2); if(R == 24){printf("(%.1f%c%.1f)*(%.1f%c%.1f)=%.1f\\n",A,o,B,C,p,D,R); return 1;} // 计算判断乘法
 52     R = div(p1,p2); if(R == 24){if(p1>p2){printf("(%.1f%c%.1f)/(%.1f%c%.1f)=%.1f\\n",A,o,B,C,p,D,R);}else{printf("(%.1f%c%.1f)-(%.1f%c%.1f)=%.1f\\n",C,p,D,A,o,B,R);} return 1;} // 计算判断除法
 53     return 0;
 54 }
 55 
 56 /* 调用part1|part2计算函数,并暴力完成part1和part2所有组合方式的枚举 */
 57 int all_seq_try(float A,float B,float C,float D)
 58 {
 59     float p1;
 60     float p21 = C+D; if(p21 == 0) { p21 = 0.001; } // 计算不同的part2
 61     float p22 = C-D; if(p22 == 0) { p22 = 0.001; }
 62     float p23 = D-C; if(p23 == 0) { p23 = 0.001; }
 63     float p24 = C*D; if(p24 == 0) { p24 = 0.001; }
 64     float p25 = C/D; if(p25 == 0) { p25 = 0.001; }
 65     float p26 = D/C; if(p26 == 0) { p26 = 0.001; }
 66 
 67     // printf("A+B\\n");
 68     p1 = A+B; if(p1 == 0) { p1 = 0.001; } // 计算part1 并规避为0的程序Bug
 69     if(four_calc_try(p1,p21,A,B,C,D,\'+\',\'+\')) {return 1;} // 测试part1和part2 当前状态下的情况
 70     if(four_calc_try(p1,p22,A,B,C,D,\'+\',\'-\')) {return 1;}
 71     if(four_calc_try(p1,p23,A,B,D,C,\'+\',\'-\')) {return 1;}
 72     if(four_calc_try(p1,p24,A,B,C,D,\'+\',\'*\')) {return 1;}
 73     if(four_calc_try(p1,p25,A,B,C,D,\'+\',\'/\')) {return 1;}
 74     if(four_calc_try(p1,p26,A,B,D,C,\'+\',\'/\')) {return 1;}
 75 
 76     // printf("A-B\\n");
 77     p1 = A-B; if(p1 == 0) { p1 = 0.001; }
 78     if(four_calc_try(p1,p21,A,B,C,D,\'-\',\'+\')) {return 1;}
 79     if(four_calc_try(p1,p22,A,B,C,D,\'-\',\'-\')) {return 1;}
 80     if(four_calc_try(p1,p23,A,B,D,C,\'-\',\'-\')) {return 1;}
 81     if(four_calc_try(p1,p24,A,B,C,D,\'-\',\'*\')) {return 1;} // 2 4 2 11 (-2,22)
 82     if(four_calc_try(p1,p25,A,B,C,D,\'-\',\'/\')) {return 1;}
 83     if(four_calc_try(p1,p26,A,B,D,C,\'-\',\'/\')) {return 1;}
 84 
 85     // printf("A*B\\n");
 86     p1 = A*B; if(p1 == 0) { p1 = 0.001; }
 87     if(four_calc_try(p1,p21,A,B,C,D,\'*\',\'+\')) {return 1;}
 88     if(four_calc_try(p1,p22,A,B,C,D,\'*\',\'-\')) {return 1;}
 89     if(four_calc_try(p1,p23,A,B,D,C,\'*\',\'-\')) {return 1;}
 90     if(four_calc_try(p1,p24,A,B,C,D,\'*\',\'*\')) {return 1;}
 91     if(four_calc_try(p1,p25,A,B,C,D,\'*\',\'/\')) {return 1;}
 92     if(four_calc_try(p1,p26,A,B,D,C,\'*\',\'/\')) {return 1;}
 93 
 94 
 95     // printf("A/B\\n");
 96     if(B==0) {p1 = 1000000;} else{p1 = A/B;} if(p1 == 0) { p1 = 0.001; }
 97     if(four_calc_try(p1,p21,A,B,C,D,\'/\',\'+\')) {return 1;}
 98     if(four_calc_try(p1,p22,A,B,C,D,\'/\',\'-\')) {return 1;}
 99     if(four_calc_try(p1,p23,A,B,D,C,\'/\',\'-\')) {return 1;}
100     if(four_calc_try(p1,p24,A,B,C,D,\'/\',\'*\')) {return 1;}
101     if(four_calc_try(p1,p25,A,B,C,D,\'/\',\'/\')) {return 1;}
102     if(four_calc_try(p1,p26,A,B,D,C,\'/\',\'/\')) {return 1;}
103 
104     // printf("B-A\\n");
105     p1 = B-A; if(p1 == 0) { p1 = 0.001; }
106     if(four_calc_try(p1,p21,B,A,C,D,\'-\',\'+\')) {return 1;}
107     if(four_calc_try(p1,p22,B,A,C,D,\'-\',\'-\')) {return 1;}
108     if(four_calc_try(p1,p23,B,A,D,C,\'-\',\'-\')) {return 1;}
109     if(four_calc_try(p1,p24,B,A,C,D,\'-\',\'*\')) {return 1;}
110     if(four_calc_try(p1,p25,B,A,C,D,\'-\',\'/\')) {return 1;}
111     if(four_calc_try(p1,p26,B,A,D,C,\'-\',\'/\')) {return 1;}
112 
113     // printf("B/A\\n");
114     if(A==0) {p1 = 1000000;} else{p1 = B/A;} if(p1 == 0) { p1 = 0.001; }
115     if(four_calc_try(p1,p21,B,A,C,D,\'/\',\'+\')) {return 1;}
116     if(four_calc_try(p1,p22,B,A,C,D,\'/\',\'-\')) {return 1;}
117     if(four_calc_try(p1,p23,B,A,D,C,\'/\',\'-\')) {return 1;}
118     if(four_calc_try(p1,p24,B,A,C,D,\'/\',\'*\')) {return 1;}
119     if(four_calc_try(p1,p25,B,A,C,D,\'/\',\'/\')) {return 1;}
120     if(four_calc_try(p1,p26,B,A,D,C,\'/\',\'/\')) {return 1;}
121 
122     return 0;
123 }
124 
125 /* 
126 任何数字的基本运算都可以分割成为基本的双目运算,这是计算的基本性质,据此,我们将4个数字的运算分解为两个part的运算。
127 被分割之后的运算又是两个数字的计算,因此,枚举出所有的双目运算的全部情况,就可以完成数据的判断和计算。
128  */
129 int Get_Methed_Func(float *N)
130 {
131     float A=N[0],B=N[1],C=N[2],D=N[3];
132     // Mothed-0:(X0,X1)|(X2,X3)
133     // printf("Mothed-0\\n");
134     if(all_seq_try(A,B,C,D)) {return 1;} // AB组合 CD组合 情景1
135     // Mothed-1:(X0,X2)|(X1,X3)
136     // printf("Mothed-1\\n");
137     if(all_seq_try(A,C,B,D)) {return 1;} // AC组合 BD组合 情景2
138     // Mothed-2:(X0,X3)|(X1,X2)
139     // printf("Mothed-2\\n");
140     if(all_seq_try(A,D,B,C)) {return 1;} // AD组合 BD组合 情景3
141     return 0;
142 }

运行方式1:

运行方式2: 

以上是关于DataStruct Based on String!的主要内容,如果未能解决你的问题,请参考以下文章

[记录]calculate age based on date of birth

GCN BASED ON pytorch geometric

Shell Sort based on insert sort

Edge Computing Implementation Based on VM

Edge Computing Implementation Based on VM

Edge Computing Implementation Based on Docker Containers