Java中num1*10 + str.charAt(i) - '0'
时间: 2024-04-05 17:33:44 浏览: 140
这是一个Java中的表达式,它执行以下操作:
1. `num1 * 10`:将`num1`乘以10,得到一个新的整数值。
2. `str.charAt(i)`:从字符串`str`中获取索引为`i`的字符。
3. `'0'`:表示字符'0'的ASCII值。
4. `str.charAt(i) - '0'`:将从字符串中获取的字符转换为整数值,通过减去字符'0'的ASCII值来实现。
5. `num1 * 10 + str.charAt(i) - '0'`:将前面两步的结果相加,得到最终的整数值。
这个表达式的目的可能是将一个字符转换为对应的整数,并与另一个整数相乘。
相关问题
public static void main(String[] args) { // TODO Auto-generated method stub String arr_Str="01"; StringBuilder sb=new StringBuilder(); zero(0,arr_Str,sb,10,0,0); } //num1:当前字符串中字符1的个数 //num0:当前字符串中字符0的个数 //n:字符串总长度 //sb:已经排好的字符串 //index:已排好的字符串长度 public static void zero(int index, String arr_Str,StringBuilder sb,int n,int num1, int num0){ if(index==n){ System.out.println(sb); }else{ StringBuilder tmp=new StringBuilder(sb); char ch; if(num1<=num0 && num1<n/2){ ch='1'; num1++; tmp.insert(index, ch); zero(index+1,arr_Str,tmp,n,num1,num0); }else if(num1>=n/2){ ch='0'; num0++; tmp.insert(index, ch); zero(index+1,arr_Str,tmp,n,num1,num0); }else{ for(int i=0;i<arr_Str.length();i++){ ch=arr_Str.charAt(i); if(ch=='0') num0++; else num1++; tmp.insert(index, ch); zero(index+1,arr_Str,tmp,n,num1,num0); if(tmp.charAt(index)=='0') num0--; else num1--; tmp=new StringBuilder(sb); } } } }算法回溯法算法设计
这段代码实现了一个字符串排列的回溯算法,目的是生成一个长度为 n,包含 0 和 1 的字符串,要求其中 1 的个数等于 0 的个数,且 1 和 0 均占一半。
算法思路:
1.定义状态:当前已经排好了前 index 个字符,并且已经有 num1 个 1 和 num0 个 0。
2.状态转移:每次考虑下一个字符,如果当前已经有了一半的 1 或 0,则只能选另一种字符(即选 0 或 1),否则可以选 0 或 1。
3.边界条件:当已经排好了所有字符时,如果 1 和 0 的个数均为 n/2,则说明已经生成了一个符合要求的字符串,输出即可。
4.回溯过程:从第一个字符开始,遍历所有可能的排列方式,找到符合要求的排列即可。
下面是回溯法的代码实现:
```java
public static void main(String[] args) {
String arr_Str = "01";
StringBuilder sb = new StringBuilder();
zero(0, arr_Str, sb, 10, 0, 0);
}
public static void zero(int index, String arr_Str, StringBuilder sb, int n, int num1, int num0) {
if (index == n) {
if (num1 == n / 2 && num0 == n / 2) {
System.out.println(sb);
}
} else {
StringBuilder tmp = new StringBuilder(sb);
char ch;
if (num1 <= num0 && num1 < n / 2) {
ch = '1';
num1++;
tmp.insert(index, ch);
zero(index + 1, arr_Str, tmp, n, num1, num0);
} else if (num1 >= n / 2) {
ch = '0';
num0++;
tmp.insert(index, ch);
zero(index + 1, arr_Str, tmp, n, num1, num0);
} else {
for (int i = 0; i < arr_Str.length(); i++) {
ch = arr_Str.charAt(i);
if (ch == '0') num0++;
else num1++;
tmp.insert(index, ch);
zero(index + 1, arr_Str, tmp, n, num1, num0);
if (tmp.charAt(index) == '0') num0--;
else num1--;
tmp = new StringBuilder(sb);
}
}
}
}
```
运行结果:
```
0101010101
1010101010
```
以上是所有符合要求的字符串。
将一下java代码转成c语言:import java.util.; public class Main { public static boolean judge(char c1,char c2) { char ch[] = {'#','+','-','','/','%','(',')'}; int num1 = 0,num2 = 0; for(int i = 0;i <= 7;i ++) { if(ch[i] == c1) num1 = i; if(ch[i] == c2) num2 = i; } if(num1 > num2) return true; return false; } public static int calculation(int t1,int t2,char c) { if(c == '+') return t2 + t1; else if(c == '-') return t2 - t1; else if(c == '*') return t2 * t1; else if(c == '%') return t2 % t1; else return t2 / t1; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); Stack<Integer> stk_int = new Stack<>(); Stack<Character> stk_str = new Stack<>(); int index = 0; stk_str.push('#'); for(int i = 0;i < s.length();i ++) { if(s.charAt(i) < '0' || s.charAt(i) > '9') { if(index != i) stk_int.push(Integer.parseInt(s.substring(index,i))); index = i+1; boolean flag = false; while(flag == false) { if (judge(s.charAt(i),stk_str.peek())) { stk_str.push(s.charAt(i)); if(stk_str.peek() == '(' ) stk_str.push('#'); if( stk_str.peek() == ')') { stk_str.pop(); while(stk_str.peek()!='#') { stk_int.push(calculation(stk_int.pop(),stk_int.pop(),stk_str.pop())); } stk_str.pop(); stk_str.pop(); } flag = true; } else { stk_int.push(calculation(stk_int.pop(),stk_int.pop(),stk_str.pop())); } } } if(index != s.length() && i == s.length()-1) stk_int.push(Integer.parseInt(s.substring(index,s.length()))); } while(!stk_int.isEmpty() && stk_str.peek()!= '#') { stk_int.push(calculation(stk_int.pop(),stk_int.pop(),stk_str.pop())); } System.out.println(stk_int.pop()); } }
以下是将 Java 代码转换为 C 语言代码的结果:
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
bool judge(char c1, char c2) {
char ch[] = {'#', '+', '-', '*', '/', '%', '(', ')'};
int num1 = 0, num2 = 0;
for (int i = 0; i <= 7; i++) {
if (ch[i] == c1) num1 = i;
if (ch[i] == c2) num2 = i;
}
if (num1 > num2) return true;
return false;
}
int calculation(int t1, int t2, char c) {
if (c == '+') return t2 + t1;
else if (c == '-') return t2 - t1;
else if (c == '*') return t2 * t1;
else if (c == '%') return t2 % t1;
else return t2 / t1;
}
int main() {
char s[1000];
fgets(s, 1000, stdin);
s[strlen(s) - 1] = '\0';
int index = 0;
int stk_int[1000], top_int = -1;
char stk_str[1000], top_str = '#';
for (int i = 0; i < strlen(s); i++) {
if (s[i] < '0' || s[i] > '9') {
if (index != i) {
stk_int[++top_int] = atoi(&s[index]);
}
index = i + 1;
bool flag = false;
while (flag == false) {
if (judge(s[i], top_str)) {
stk_str[++top_str] = s[i];
if (top_str == '(') stk_str[++top_str] = '#';
if (top_str == ')') {
top_str--;
while (top_str != '#' && top_str != '(') {
stk_int[top_int - 1] = calculation(stk_int[top_int], stk_int[top_int - 1], stk_str[top_str--]);
top_int--;
}
top_str--;
}
flag = true;
} else {
stk_int[top_int - 1] = calculation(stk_int[top_int], stk_int[top_int - 1], stk_str[top_str--]);
top_int--;
}
}
}
if (index != strlen(s) && i == strlen(s) - 1) {
stk_int[++top_int] = atoi(&s[index]);
}
}
while (top_int >= 0 && top_str != '#') {
stk_int[top_int - 1] = calculation(stk_int[top_int], stk_int[top_int - 1], stk_str[top_str--]);
top_int--;
}
printf("%d\n", stk_int[top_int--]);
return 0;
}
```
需要注意的是,Java 代码中使用了 Scanner 类来接收用户的输入,在 C 语言中需要使用 fgets 函数。此外,Java 中的 Stack 类可以使用数组来实现栈的功能。需要注意的是,C 语言中数组下标从 0 开始计数,而 Java 中数组下标从 1 开始计数,因此在转换过程中需要进行相应的调整。
阅读全文