题目描述
题目描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
输入描述
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述
删除字符串中出现次数最少的字符后的字符串。
示例输入
abcdd
示例输出
dd
开发工具
本人使用开发工具为VisualStudio2019。
编程语言
本人将用C#和C++实现此题功能。至于为什么选择这两种语言,是因为本人比较钟爱。当然也有其他原因,目前三大主流游戏开发工具,即Unity、Unreal和Cocos2dx均可使用这两种语言编写脚本。
代码开始
首先我们先用C#实现,建一个WPF应用程序,打开mainwindow.xaml文件,先布下局,主要就是输入的文本框和输出的结果显示:
<Window x:Class="RemoveChar.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:RemoveChar"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Vertical">
<Label Margin="0,10,0,0" FontSize="18"
Width="260" Height="40"
VerticalContentAlignment="Center">
请输入一串字符,确认后回车。
</Label>
<TextBox x:Name="txt_InputString" Margin="0,10,0,0"
Width="260" Height="40" FontSize="18"
VerticalContentAlignment="Center"
KeyDown="txt_InputString_KeyDown">
</TextBox>
<Label Margin="0,10,0,0" FontSize="18"
Width="260" Height="40"
VerticalContentAlignment="Center">
结果:
</Label>
<TextBlock x:Name="txb_OutputString" Margin="0,10,0,0"
Width="260" Height="40" FontSize="18">
</TextBlock>
</StackPanel>
</Grid>
</Window>
首先,我们写一个方法,这个方法接收一个输入的string,并通过一些逻辑处理,返回一个输出的string:
/// <summary>
/// 去除给定字符串中频度最低字符
/// </summary>
/// <param name="input">输入字符</param>
/// <returns>输出字符</returns>
private string RemoveChar(string input)
{
string output = "";
//逻辑处理部分
return output;
}
接下来我们来分步分析并实现。
获取字符出现次数
首先,我们应该先拿到输入的字符串中不同字符的出现次数,可以用一个数组来存储次数值:
int[] charFrequency = new int[26]; //用来存每个字符出现次数,最多也就26个
//计算输入的字符串中不同字符频度
for(int i = 0; i < input.Length; i++)
{
charFrequency[input[i] - 'a']++; //因为字符串只包含英文小写字母,所以可以从a开始计
}
获取字符的最低频度
接下来,我们应该拿到所有字符频度中最低的频度:
int minFrequency = 20; //因为输入字符串的长度小于等于20,所以极限情况也就是单个字符频度为20
//如果有字符频度小于minFrequency,就更新minFrequency值
for (int i = 0; i < input.Length; i++)
{
if (charFrequency[input[i] - 'a'] < minFrequency)
minFrequency = charFrequency[input[i] - 'a'];
}
删除字符串中频度最低字符
最后,我们把输入字符串中我们找到的频度最低字符删掉就好了:
//拼接输出字符串,去掉频度最低的字符
for (int i = 0; i < input.Length; i++)
{
if (charFrequency[input[i] - 'a'] != minFrequency)
output = output + input[i];
}
C#完整代码
这里我把WPF项目的mainwindow.xaml.cs的代码都贴出来:
using System.Windows;
using System.Windows.Input;
namespace RemoveChar
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 输入文本框按键事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_InputString_KeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Enter) //按下回车键
{
txb_OutputString.Text = RemoveChar(txt_InputString.Text.ToString());
}
}
/// <summary>
/// 去除给定字符串中频度最低字符
/// </summary>
/// <param name="input">输入字符</param>
/// <returns>输出字符</returns>
private string RemoveChar(string input)
{
string output = "";
int[] charFrequency = new int[26]; //用来存每个字符出现次数,最多也就26个
int minFrequency = 20; //因为输入字符串的长度小于等于20,所以极限情况也就是单个字符频度为20
//计算输入的字符串中不同字符频度
for(int i = 0; i < input.Length; i++)
{
charFrequency[input[i] - 'a']++; //因为字符串只包含英文小写字母,所以可以从a开始计
}
//如果有字符频度小于minFrequency,就更新minFrequency值
for (int i = 0; i < input.Length; i++)
{
if (charFrequency[input[i] - 'a'] < minFrequency)
minFrequency = charFrequency[input[i] - 'a'];
}
//拼接输出字符串,去掉频度最低的字符
for (int i = 0; i < input.Length; i++)
{
if (charFrequency[input[i] - 'a'] != minFrequency)
output = output + input[i];
}
return output;
}
}
}
C++完整代码
逻辑与C#实现类似,这里我直接贴出代码:
#include<iostream>
#include<string>
using namespace std;
string RemoveChar(string input);
int main()
{
string input;
string output;
cout << "请输入一串字符:" << endl;
getline(cin, input);
cout << "结果:" << endl;
output = RemoveChar(input);
cout << output << endl;
return 0;
}
/// <summary>
/// 去除给定字符串中频度最低字符
/// </summary>
/// <param name="input">输入字符</param>
/// <returns>输出字符</returns>
string RemoveChar(string input)
{
string output = "";
int charFrequency[26] = { 0 }; //用来存每个字符出现次数,最多也就26个
int minFrequency = 20; //因为输入字符串的长度小于等于20,所以极限情况也就是单个字符频度为20
//计算输入的字符串中不同字符频度
for (int i = 0; i < input.size(); i++)
{
charFrequency[input[i] - 'a']++; //因为字符串只包含英文小写字母,所以可以从a开始计
}
//如果有字符频度小于minFrequency,就更新minFrequency值
for (int i = 0; i < input.size(); i++)
{
if (charFrequency[input[i] - 'a'] < minFrequency)
minFrequency = charFrequency[input[i] - 'a'];
}
//拼接输出字符串,去掉频度最低的字符
for (int i = 0; i < input.size(); i++)
{
if (charFrequency[input[i] - 'a'] != minFrequency)
output = output + input[i];
}
return output;
}