一、题目链接
http://noi.openjudge.cn/ch0107/02/
二、解题思路(Java)
◎ java.lang.String.indexOf(char c)方法:返回给定的字符c在字符串中首次出现的位置,没有出现则返回-1;
◎ java.lang.String.lastIndexOf(char c)方法:返回给定的字符c在字符串中最后一次出现的位置,没有出现则返回-1;
◎ 方法public int occurOnce(String text)处理所有业务逻辑:
→ 参数text为String类型的对象,代表给定字符串;
→ occurOnce方法返回非负整数,代表text中第一个只出现一次的字符的下标,没有则为-1;
◎ 定义char类型的数组chars,用于存储text中的每个字符,定义语句如下:
→ char[] chars = text.toCharArray();
◎ 定义int类型的整数n,代表text的长度,令n = text.length();
◎ 从第一个字符开始,到最后一个字符为止,利用循环i处理如下:
→ 如果当前字符chars[i]首次出现的位置等于最后一次出现的位置,则chars[i]就是所求字符,返回它的下标i;
循环i结束后,如果没有产生返回,说明没有符合条件的字符,返回-1;
◎ 在main方法中调用occurOnce方法,注入相应的参数后即可获得计算结果ans,如果ans为-1,说明text中没有符合条件的字符,输出no,否
则输出字符串在ans位置上的字符。
三、解题思路(C++)
◎ find(char c)函数:返回给定的字符c在字符串中首次出现的位置,没有出现则返回npos;
◎ rfind(char c)函数:返回给定的字符c在字符串中最后一次出现的位置,没有出现则返回npos;
◎ 定义并输入string类型的字符串text,代表给定字符串;
◎ 定义bool类型的逻辑量flag,标记是否有符合条件的字符,初始时为false,也即默认没有;
◎ 利用foreach循环遍历获取text中的每个字符c:
→ 如果当前字符c首次出现的位置等于最后一次出现的位置,则当前字符c就是所求字符:
*** 输出当前字符c;
*** 令flag = true,也即标记有符合条件的字符;
*** 无需再检测剩余的字符,跳出循环;
◎ 如果flag为false,代表没有符合条件的字符,输出no。
四、Java程序
import java.util.Scanner;
public class Main {
public int occurOnce(String text) {
char[] chars = text.toCharArray();
int n = text.length();
for (int i = 0; i < n; i++) {
if (text.indexOf(chars[i]) == text.lastIndexOf(chars[i])) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
String text = input.next();
int ans = test.occurOnce(text);
if (ans == -1) {
System.out.print("no");
}
else {
System.out.print(text.charAt(ans));
}
}
}
五、C++程序
#include <iostream>
using namespace std;
int main()
{
string text;
cin >> text;
bool flag = false;
for (char c: text)
{
if (text.find(c) == text.rfind(c))
{
cout << c;
flag = true;
break;
}
}
if (!flag)
{
cout << "no";
}
return 0;
}