解析华为OJ题——删除字符串中出现次数最少的字符

题目描述

题目描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
输入描述
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦朝炼丹师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值