bigger is greater

老探长早年痛失爱人,悲伤中心理极度扭曲决定建设和谐社会,纠集以德治镇论者建立马甲幕后黑手制,杀人越货谎称事故频发、为了“更高的善”——偶语于道路者弃市,所谓田园风光、世外桃源,黑牢中死尸枕籍,何异暴秦?
大城市来的热血警探带来了改革春风,阿夫乐尔号的一声炮响,给桑福德小镇送来了社会主义。幸福的幻象被无情击碎,1984狰狞现出本相。砰砰砰砰,压在小镇居民身上的三座大山终于被推倒,原来号称推广着幸福人生的人们最险恶。

heckerrank 算法题。

中国至今仍然世外桃源主义大行于道,城市被人们看作樊笼桎梏,动不动就矫情地要回归大自然、向往着田园和乡土——冯小刚当年在《甲方乙方》里出色地讽刺过了,没想到至今还有这么多人继续撒癔症。
与天朝上国不同,英美当今的许多文学影视作品中,小镇和乡村遭到了无情的讽刺,当然这和话语权掌握在来自大城市和作为现代工业的作家、编剧以及电影工业有关,甚或只不过是更方便成为某些电影的背景环境——但是话语权的归属本身就已经判断了城乡之间优劣至少是胜负或能力的高低。粗略想了一下,作为妖魔鬼怪的小镇在以下文学影视作品中都有表现:
1、《小城畸人》http://www.douban.com/subject/2038364/
2、House of Wax
http://www.douban.com/subject/1309184/
3、一部在朋友家里看的片子,恐怖片,开头是两个人迷路到了一个小镇,一番打杀之后好容易逃了出来,片尾是他们又一次开车到了这个小镇,故事于是循环往复。
4、Dogville
http://www.douban.com/subject/1298759/
5、本片,hot fuzz
……nnd,想不起来了

原题地址

又,据说本片戏仿经典无数,我眼拙只看出“妖夜荒踪”。
至于最后真相,“他不是一个人在战斗”,又让我想起阿加莎克里斯蒂经典小说《东方快车谋杀案》——踩在巨人的肩膀上也不容易,后人总是以为你的脚下会有巨人

此题大意为找到,字典序的下一个最小序列。

再,这个评论写得比我这篇好多了,大家都看看吧:http://www.douban.com/review/1156203/

input

dhck
dkhc

output

dhkc
hcdk

通过代码

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

string rever(string str, int index ){

    string temp = str.substr(index+1);

    int length = temp.length();
    for(int i = 0 ; i< length / 2;i++){
        char aa = temp[i];
        temp[i] = temp[length-i-1];
        temp[length-i-1] = aa;
    }
    string result = str.substr(0,index+1) + temp;
    return result;
}
void handle(string str){
    if( str.length() == 1 ){
        cout<<"no answer"<<endl;
        return;
    }
    int flag = 0;
    int length = str.length();
    string result;
     for( int i = length - 2 ; i >= 0 ; i-- ){
        if( str[ i ] < str[ i + 1 ] ) {

            for( int j = i + 1 ; j < length ; j++ ){
                if( str[i] < str[j] && (!str[j+1]||str[i] >= str[j+1])){
                    char temp = str[i];
                    str[i] = str[j];
                    str[j] = temp;
                    cout<<str<<endl;
                    result = rever(str,i);
                    break;
                }
            } 
            flag = 1;
            break;
        }

     }
     if( flag == 1 ) {
        cout<<result<<endl;
     }else{
        cout<<"no answer"<<endl;
     }

}

int main() {
    int count = 0;

    cin>>count;
    string s[count];
    for( int i = 0 ; i < count ; i++ ){
        cin>>s[i];
        handle(s[i]);
    }

    return 0;
}

我的解题思路

首先此题的难点就是找到最小的下一个字典序,所以,我从一个字符串的最后往前,进行遍历。

for( int i = length - 2 ; i >= 0 ; i-- )

如果str[i] < str[i+1],找到需要改变的子字符串。为str[i,length)

if( str[ i ] < str[ i + 1 ] ) {

            for( int j = i + 1 ; j < length ; j++ ){
                if( str[i] < str[j] && (!str[j+1]||str[i] >= str[j+1])){
                    char temp = str[i];
                    str[i] = str[j];
                    str[j] = temp;
                    cout<<str<<endl;
                    result = rever(str,i);
                    break;
                }
            } 
            flag = 1;
            break;
        }

// 从[i+1,length) 找到大于str[i],如果有多于一个字符大于str[i],那么就找到最小的哪一个。和str[i],进行交换。最后将str[i+1,length]rever,替换之前的str[i+1,length]。

发表评论

电子邮件地址不会被公开。 必填项已用*标注