题目描述
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出 no
。
题目链接:B2110 找第一个只出现一次的字符 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
输入格式
一个字符串,长度小于 1100。
输出格式
输出第一个仅出现一次的字符,若没有则输出 no
。
解题思路
我们定义一个数组用来记录每个字母的出现数量,通过for循环遍历实现,接着再通过for循环遍历去判断该字符出现的次数是否为1,如果是则输出第一个这样的字符并退出循环,如果循环遍历完仍没有找到出现次数为1的字符,那么输出no
解题代码
C代码
#include<stdio.h>
#include<string.h>
int main(){
char str[1101];
scanf("%s",&str);
int len = strlen(str);
int flag[26];//定义flag标记数组,一共26个字母
memset(flag,0,sizeof(flag));//初始化flag数组为0
for(int i = 0; i < len; i++){
int num = str[i] - 'a';
if(flag[num] == 0)//第一次出现则为1
flag[num] = 1;
else//多次出现为2
flag[num] = 2;
}
for(int i = 0; i < len; i++){
int num = str[i] - 'a';
if(flag[num] == 1)//第一个出现一次的字符
{
printf("%c",str[i]);
return 0;
}
}
printf("no");
return 0;
}
C++代码
#include<iostream>
using namespace std;
const int N = 27; //只有26个英文字母,定义数组最大长度
string str;
int a[N];
int main()
{
int flag = -1;
cin>>str;
for(int i=0;i<str.size();i++){
int t = str[i] - 'a'; //将字母转化为对应的0~25的整数
a[t] ++; //统计每个字母出现的次数
}
for(int i=0;i<str.size();i++){
int t = str[i] - 'a';
if(a[t] == 1){ //判断每个字是否只出现一次
flag = t; //记录这个字母对应的下表
break;
}
}
if(flag != -1) cout<<(char)(flag + 'a');
else cout<<"no";
return 0;
}
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数据
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
//定义数组用来计算每个字母出现的顺序
//由于只有26个字母,因此我们定义数组的大小为30,并初始化为0
int[] num = new int[30];
for (int i = 0; i < 30; i++){
num[i] = 0;
}
//遍历字符串
for (int i = 0; i < str.length(); i++){
num[str.charAt(i) - 'a']++;//题目只有小写字母
}
boolean flag = false;//判断字符串中是否有出现一次的字母
//判断第一个出现一次的字母
for (int i = 0; i < str.length(); i++){
if(num[str.charAt(i) - 'a'] == 1){
System.out.println(str.charAt(i));
flag = true;
break;//退出循环
}
}
if(flag == false){
//表示没有出现一次的字符
System.out.println("no");
}
}
}