剑指offer自学系列(五)
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"
class Solution {
public:
void Insert(char ch) {
s += ch;
hash[ch]++;
}
char FirstAppearingOnce() {
for (int i = 0; i < s.size();i++) {
if (hash[s[i]] == 1)
return s[i];
}
return '#';
}
private:
string s;
char hash[256] = { 0 };
}
题目分析:
字符串流键入,在插入函数处,我们将字符串连接起来形成字符串,由于字符串值不超过256,所以将hash表设为256长度的数组,我们想要找出第一个非重复的字符,重复的必然hash[ch]==2,所以非重复的只要判断条件为1即可。
下面再看一个常见的算法题,数学中常用的全排列,我思考了两天时间,发现自己真是蠢,把结果输出一下就能弄懂别人代码的思路了,吸取教训,下面看题:
题目描述:
输入一个字符串,打印出该字符串的全排列,例如,输入“abc”,则得到abc,acb,bac,bca,cba,cab六种结果,其实往更深层次考虑还有重复的情况,我们首先考虑不重复的情况,全排列算法
题目分析:
首先按数学的思路,我们固定第一个字符a,然后求后面的bc有几种全排列,我们发现这就是一个递归问题,但是我们希望得到全部的全排列,因此我们每轮需要把首字符换成字符中的一个值,这里我们用一个循环可以解决。
#include <iostream>
using namespace std; int sum = 0;//记录有多少种组合 void Swap(char str[], int a, int b)
{
char temp = str[a];
str[a] = str[b];
str[b] = temp;
} void Perm(char str[], int begin, int end)
{
if (begin == end)
{
for (int i = 0; i <= end; i++)
{
cout << str[i];
}
cout << endl;
sum++;
}
else
{
for (int j = begin; j <= end; j++)
{
//cout << "swap(" << str << "," << begin << "," << j << ")" << endl;
Swap(str, begin, j);
//cout << "perm(" << str << "," << begin+1 << "," << end << ")" << endl;
Perm(str, begin + 1, end);
//cout << "swap(" << str << "," << j << "," << begin << ")" << endl;
Swap(str, j, begin);
}
}
} int main()
{
int n;
char c[16];
char tmp; cin >> n;
tmp = getchar(); // 接受回车
if (1 <= n && n <= 15) {
for (int i = 0; i < n; i++) {
c[i] = getchar();
}
Perm(c, 0, n - 1);
}
cout << sum;
cout << endl;
return 0;
}
剑指offer自学系列(五)的更多相关文章
- 剑指offer自学系列(三)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,例如{5,1,4,2 ...
- 剑指offer自学系列(二)
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内,数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次,请找出数组中任一个重复的数字,例如,如果输入长度为7的 ...
- 剑指offer自学系列(四)
题目描述: 输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323 题目分析: 如果采用穷举法,把 ...
- 剑指offer自学系列(一)
题目描述:输入n个整数,找出其中最小的k个数,例如,输入{4,5,1,6,2,7,3,8}这8个数字,最小的4个数字是1,2,3,4 题目分析:首先我能想到的是先对数组排序,从小到大,然后直接输出想要 ...
- 剑指offer题目系列三(链表相关题目)
本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照 ...
- 剑指offer三十五之数组中的逆序对
一.题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 剑指offer题目系列二
本篇延续上一篇,介绍<剑指offer>第二版中的四个题目:从尾到头打印链表.用两个栈实现队列.旋转数组的最小数字.二进制中1的个数. 5.从尾到头打印链表 题目:输入一个链表的头结点,从尾 ...
- 剑指offer题目系列一
本篇介绍<剑指offer>第二版中的四个题目:找出数组中重复的数字.二维数组中的查找.替换字符串中的空格.计算斐波那契数列第n项. 这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺 ...
- 《剑指Offer》题五十一~题六十
五十一.数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.例如,在数组{7, 5, 6, 4}中,一共存 ...
随机推荐
- Atcoder Grand Contest 037B(DP,组合数学,思维)
#include<bits/stdc++.h>using namespace std;const long long mod = 998244353;string s;int a[3000 ...
- react - get或set 取值函数
取值函数(getter)和存值函数(setter) 您可以添加以get或set为前缀的方法来创建getter和setter,它们是根据您正在执行的操作执行的两个不同的代码:访问变量或修改其值.对某个属 ...
- 设计模式课程 设计模式精讲 2-2 UML类图讲解
1 类图讲解 1 类图讲解 + 公共方法 - private权限 # protected权限 包内和包外继承的子类都能引用 ~ default权限(包权限)只有包内能引用 下划线 静态 Stati ...
- Idea牛逼插件,拿走不谢
1.grep console java 开发的过程中,日志都会输出到console,输出的内容是非常多的,所以需要有一个工具可以方便的查找日志,或者可以非常明显显示我们关注的内容,grep conso ...
- 「CF1C Ancient Berland Circus」
CF第一场比赛的最后一题居然是计算几何. 这道题的考点也是比较多,所以来写一篇题解. 前置芝士 平面直角坐标系中两点距离公式:\(l=\sqrt{(X_1-X_2)^2+(Y_1-Y_2)^2}\) ...
- Nginx 的优势
Nginx 的优势 在 Java 开发中,Nginx 有着非常广泛的使用,随便举几点: 使用 Nginx 做静态资源服务器:Java 中的资源可以分为动态和静态,动态需要经过 Tomcat 解析之后, ...
- Android:用代码修改一行文字中某几个字的颜色
TextView changeVideoQualityTxt = (TextView) rootView.findViewById(R.id.enter_wireless_display_txt); ...
- java递归调用 return的问题
最近比较闲,写了个递归调用获取最大公约数,刚开始写错了,但一直不明白错在哪,错误代码如下: public class Demo { public static void main(String[] a ...
- windos常见软件库
1.护卫神软件库 http://soft.huweishen.com/special/1.html 2.护卫神windows资料库 http://v.huweishen.com/ 3.国超软件下载 h ...
- postgres 删除外部表
drop external table if exists tableName;